标签:
位运算的几个运算符 |(或) &(与) ~(非) ^(异或) >>(右移) <<(左移)
1.两次异或为本身
(可用于加密,两数字互换)
1001 ^ 1101 = 0100;0100 ^ 1101 = 1001;
2.移位运算的右移>>
一般机器支持两种右移:逻辑右移和算数右移。
逻辑右移在右边补0: x >> k ==> [0,...0, xn-1,xn-2,...x0]
算术右移在右边补最高位有效值(0或1,这个在有符号数据中比较有用): x >> k ==> [xn-1,...xn-1, xn-1,xn-2,...xk]
常用的(可理解为默认的)为算术右移。java中区别两种符号,用>>表算术右移,用>>>表逻辑右移
32位的有符号整数(c#里面是int类型),>>31,正数只能为0,负数只能为-1.(有意思的0和-1)
验证:0(正整数最高位为0) 1010.....,右移31位后,加上最前面的符号0,全部为0,则结果为0
1(负数的符号位)1010...,不论第一个1的后面31位是什么,右移31位时,算术右移补右边最高位有效值,也就是1,最终的二进制表达式为32个1,即十进制的-1.
3.-2 >> n = -1 (其中n>=1)
还是有意思的-1.
负数的二进制表达式 原码 ---> 反码 --->补码
-10的二进制表达式:
原码:00000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码(在反码上-1): 11111111 11111111 11111111 11110100 = -10
因此,-2的二进制表达式为:11111111 11111111 11111111 11111110。看到这里,有种恍然大悟的感觉吧。
4.位移超过了数据类型最高位?
譬如:32位正整数 100 >> 60 = ?
把60%32=28 ==> 100 >> 28
标签:
原文地址:http://www.cnblogs.com/icyJ/p/4374302.html