不计进位的和是a^b,进位和是a&b a+b=a^b+(a&b)<<1
1、位运算
Java中有4个位运算,他们的运算规则如下:
(1)按位与(&):两位全为1,结果为1;否则为0;
(2)按位或( | ):两位全为0,结果为0;否则为1;
(3)按位取反( ~ ):0变1,1变0;
(4)按位异或( ^ ):两位,如果相同,结果为0;如果不同,结果为1
注意:
(1)位运算中的 符号位(最高位) 也跟着变;
(2)位运算符与逻辑运算符(逻辑与&&、逻辑或||、逻辑非!)相似,但是,逻辑运算符只能操作Boolean变量【即其两边都是Boolean值】
2、位运算应用
(1)~5=?
>>>>>5的补码:00000000 00000000 00000000 00000101
>>>>>> ~5 :11111111 11111111 11111111 11111010
注意:因为高位数是1(负数),所以要将该补码转换为原码;
如果高位数是0(整数),就不需要将补码转为原码,
因为正数的原码、反码、补码都一样。
>>>>> 该负数的补码转为反码:11111111 1111111 1111111 11111001
>>>>>该负数的反码转为原码:10000000 00000000 00000000 00000110
>>>>>将二进制原码转换为十进制:0 * 2^0 + 1 * 2^1 + 1 * 2^2 = 0+2+4 = -6 (最高位为1,所以为负数
3、移位运算
Java中有三个移位运算符
(1)算术右移(>>):低位溢出,符号位不变,并用符号位补溢出的高位;
右移规则:符号位不变,左边补上符号位![正数补0,负数补1]
右移一位相当于除2,右移n位相当于除以2的n次方。
11 >>2(11为int型)
1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011
2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。
3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。
转换为十进制是3。
(2)算法左移(<<):符号位不变,低位补0;
左移规则:丢弃最高位,0补最低位!
在没有数字溢出的情况下,对于正数和负数,左移n位都相当于乘以2的n次方。
例如:3 <<2(3为int型)
1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,
2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,
转换为十进制是12。
(3)逻辑右移(>>>):低位溢出,高位补0;【注意:逻辑右移中的 符号位(最高位)也跟着变】
无符号右移运算符>>>只是对32位和64位的值有意义。
切记!切记!切记!位运算与移位运算,
都是使用的二进制的补码进行操作的!!!