在我们进行位运算的基础算法之前,先对任意一个二进制数n的第n位表示如下:
一:给一个数n,判断二进制表示第X位是0还是1
以如下为例:
//判断3的二进制第1位是0还是1 int n=3; System.out.println((n>>1)&1);
运行结果:
二:给定一个数n(二进制数),将X位的修改成1
//要将3的二进制第2位变成1 int n=3;//0 0 0 0 0 0 0 1 1 System.out.println(Integer.toBinaryString(n)); n=(1<<2)|n; System.out.println(Integer.toBinaryString(n));
运行结果:
三:给定一个二进制数n,将n的第X位修改成0
int n=3;//0 0 0 0 0 0 0 1 1 System.out.println(Integer.toBinaryString(n)); n=(~(1<<1))&n; System.out.println(Integer.toBinaryString(n));
运行结果:
四:提取一个数n,将最右侧1提取出来
int n=3;//0 0 0 0 0 0 0 1 1 System.out.println(Integer.toBinaryString(n)); n=n&(-n); System.out.println(Integer.toBinaryString(n));
运行结果:
五:干掉最右侧的1,即将最右侧的1变成0
int n=3;//0 0 0 0 0 0 0 1 1 System.out.println(Integer.toBinaryString(n)); n=n&(n-1); System.out.println(Integer.toBinaryString(n));
运行结果:
六:相关位运算力扣练习题
a:191题位1的个数 力扣191
public int hammingWeight(int n) { int count=0; while(n!=0){ n=n&(n-1); count=count+1; } return count; } //利用n=n&(n-1)将每次n的最右边的1去掉,即将1变成0,当n为0的时候,就可以终止循环
b:338题比特位计数 力扣338
public int[] countBits(int n) { int []array=new int[n]; for(int i=0;i<=n;i++){ int temp=i; int count=0; while(temp!=0){ temp=temp&(temp-1); count++; } array[i]=count; } return array; }
c:461题汉明距离 力扣461
//先进行异或,将x和y的1放在一个变量中,依据相同为0,不同为1的原则 //假设:x=1 -----> 00001 // y=4 -----> 00100 // x^y -----> 00101 //此时利用x^y&(x^y-1)可以快速计算出两者之间的距离 int temp=x^y; int count=0; while(temp!=0){ temp=temp&(temp-1); count++; } return count;