int a =1;//0001int b =2;//0010int c =4;//0100int d =8;//1000int e =15;//1111// 与运算;0001
System.out.println(Integer.toBinaryString(a & e));//0001// 或运算;0011
System.out.println(Integer.toBinaryString(a | b));//0011// 非运算;0101
System.out.println(Integer.toBinaryString(a ^ c));//0101// 异或运算;...11110111
System.out.println(Integer.toBinaryString(~d));
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
与运算;两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
或运算;两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
非运算;两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
异或运算;如果位为0,结果是1,如果位为1,结果是0
三、位运算案例
1. 获取位值
public int getBit(int number,int{
return (number >> bitPosition)&1;}
public int multiply(int a,int{int multiply =0;
while (a !=0&& b !=0){
System.out.print("计算步骤("+(isEven(b)? "偶数":"奇数")+"):a("+ String.format("%04d",Integer.valueOf(Integer.toBinaryString(a)))+") = "+ a +" | b("+ String.format("%04d",Integer.valueOf(Integer.toBinaryString(b)))+") = "+ b);// b 是偶数:2a *(b/2)
if (isEven(b)){
a = multiplyByTwo(a);
b = divideByTwo(b);}// b 奇数
else {// b 正数:2a *(b -1)/2+ a
if (isPositive(b)){
multiply += a;
a = multiplyByTwo(a);
b = divideByTwo(b -1);}// b 负数:2a *(b +1)/2- a
else {
multiply -= a;
a = multiplyByTwo(a);
b = divideByTwo(b +1);}}
System.out.println(" | multiply("+ String.format("%04d",Integer.valueOf(Integer.toBinaryString(multiply)))+") = "+ multiply);}
return multiply;}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
目的:计算有符号二进制乘积
公式:推到公式与代码向对应
= a * b
= 2a * (b/2) —— b为偶数
= 2a * (b - 1)/2 + a —— b 为奇数、正数
= 2a * (b + 1)/2 - a —— b 为奇数、负数
逻辑:乘数a不断左移、乘数b不断右移。当b归0时,a左移累计下来的值就是乘积总和。如图
11. 乘法运算(无符号)
public int multiplyUnsigned(int number1,int{int result =0;int multiplier = number2;int bitIdx =0;
while (multiplier !=0){
if ((multiplier &1)==1){
System.out.println(number1 +" << "+ bitIdx +" = "+(number1 << bitIdx));
result += number1 << bitIdx;}
bitIdx +=1;
multiplier = multiplier >>1;}
return result;}
public int countSetBits(int{int setBitsCount =0;int number = originalNumber;
while (number !=0){
setBitsCount += number &1;
number >>>=1;}
return setBitsCount;}
1.
2.
3.
4.
5.
6.
7.
8.
9.
目的:使用位运算符对一个数字里设置为1的位进行记数
逻辑:把数字每次向右移动1位,然后使用&操作符取出最右边一位的值,1则记数加1,0则不计。
13. 转换计算
public int bitsDiff(int number1, int{
return countSetBits(number1 ^ number2);
}