IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

位运算技巧整理

博学无忧 2020-02-05 15:09:47 累计浏览 2,748 次
本机暂存

位运算技巧整理

基础

异或^

两个操作数的位中,相同则结果为0,不同则结果为1。

与&

两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。

或|

两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。

非~

如果位为0,结果是1,如果位为1,结果是0.

对数组异或操作,结果值与数组中的数字顺序无关

publicstaticvoidmain(String[] args) {
        int[] array = {6,5,3,2,4,1};
        intv = 0;
        for(inti = 0;i < array.length;i++) {
            v ^= array&#91;i&#93;;
        }
        System.out.println("数组异或值是:"+ v);
}
 
&#91;/java&#93;
如果一个数组中所有数字都出现了偶数次,只有一个数字出现了一次。可以利用一个数和0异或还是自己,一个数和自己异或是0的原理,快速找到只出现一次的数字。
 
<h2> 取余数</h2>
如果一个数是2的正数次幂。另外一些数和这个数相除,取余数。
 
publicstaticvoidmain(String[] args) {
        intnum = 123;
        intlen = 32;
        intn = num % len;
        intm = num & (len - 1);
        System.out.println("m="+ m +",n="+n);

十进制转二进制

给定的数循环除以2,直到商为0或者1为止。将每一步除的结果的余数记录下来,然后反过来就得到相应的二进制了。计算机内部表示数的字节长度是固定的,比如8位,16位,32位。所以在高位补齐,java中字节码是8位的,所以高位补齐就是00001000.

publicstaticString toBinary(intnum) {
        String str = "";
        while(true) {
            str = num % 2+ str;
            num /= 2;
            if(num == 0) {
                break;
            } 
        }
        returnstr;
}

二进制转十进制

去掉高位,然后从个位开始计算2的幂(个位是0),乘以对应位数上的数字。然后,把得到的数值相加。
如,8 的二进制位是 00001000。则二进制转十进制数:

(2的0次幂)*0+(2的1次幂)*0+(2的2次幂)*0+(2的3次幂)*1= 8


同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. 最常见的电话号码 (累计阅读 8,880)
  2. 四位计算机的原理及其实现 (累计阅读 6,736)
  3. 位运算小结(按位与、按位或、按位异或、取反、左移、右移) (累计阅读 5,913)
  4. Java程序员必知的8大排序算法 (累计阅读 5,742)
  5. 快速判断一个32位的字中是否存在值为"0"的byte (累计阅读 4,999)
  6. 开源压缩算法Zopfli介绍 (累计阅读 4,558)
  7. java中byte转换int时为何与0xff进行与运算 (累计阅读 4,193)
  8. 寄存器分配初探–问题描述( Register Allocation – The Problem ) (累计阅读 3,946)
  9. java中byte转换int时为何与0xff进行与运算 (累计阅读 3,526)
  10. 原码、反码、补码相关知识总结 (累计阅读 3,359)