(一)对位运算的基本说明:
1.按位与&:两个全为1则结果为1,否则为0
2.按位或 | :两位有一个结果为1的结果为1,否则为0
3.按位异或:两位一个为0一个为1的结果为1,否则为0
4.:按位取反~:如,~2=?~5=?(下面会说到如何计算)
(二)一些小知识
1.二进制的最高位是符号位:0代表正数1代表负数
2.正数的原,返,补都一样(三码合一)
3.负数的反码=它的原码符号不变其它取反
4.负数的补码=反码加1
5.0的反码补码都是0
· 6。在计算机运算的时候都是以补码的形式来运算的(比较重要)
几种按位取反的例子:
(一)~2=?
看上面第(二)中第6点,此时我们先把2的补码写出来,由于2是正数所以原码与补码相同即:
00000000 00000000 00000000 00000010(四个字节一个字节八位)
取反就是将所有位取反
11111111 11111111 11111111 11111101
你将补码取完反后应该在转回原码才是结果,因为我们最终要原码
符号位为1所以是负数要转原码先转成反码,负数中 补码=反码+1,则反码=补码-1即:
反码为
11111111 11111111 11111111 11111100
则现在将反码变为原码就很简单了,除符号位全部取反
10000000 00000000 00000000 00000011
则最终结果为:-3
所以~2=-3
位运算符和移位运算符
(一)>>,<<算数右移和算数左移,规则:
>>算术右移:低位溢出,符号位不变并用符号位补溢出的高位
<<算数左移:符号位不变,低位补0
(二)举例:-1>>2
-1的原码
10000000 00000000 00000000 00000001
反码
11111111 11111111 11111111 11111110
补码
11111111 11111111 11111111 11111111
整体右移两位
11111111 11111111 11111111 11111111
反码(补码-1)
11111111 11111111 11111111 11111110
原码
10000000 00000000 0000000 00000001
答案为-1
因为负数的的原返补不一样,所以需要这样写,如果是正数
1<<2直接就是个1*2*2=4
1<<3:1*2*2*2=8
4>>1:4/2=2
其实就是一个移位的问题