逻辑运算与逻辑位移
位运算说穿了,就是直接对整数在内存中的二进制位进行操作。在计算机中的位运算符有如下这么几种:(&按位与) (|按位或) (^按位异或) (~按位取反) ,优先级我们不谈。每个位运算实际的效果:
假设 1 为真,这其实和数学里一样的
与运算:0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1 同为真则表现为真,其余均为假
或运算:0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1 同为假则表现为假,其余均为真
异或: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0 2个值不同,则为真,相同则为假
取反:真 , 取反 , 为假
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
移位运算用来将整型或字符型数据作为二进位信息串作整体移动。我们可以把移位运算分为2类,A:逻辑移位 B:算术移位
逻辑左移位或者右移位都是移动后,空出的位置补 0
(假设位模式是使用的二进制补码方式存储的带符号的整数)
算术左移位丢弃符号位,接收新的位作为符号位,如果新的符号位与以前相同,则移位成功,否则发生溢出(上溢\下溢)
算术右移位保留符号位,丢弃最右边的位
位模式:10011001 (-53)
进行算术右移位后:110011000 (符号位保留,之前最右边的1丢弃,最右边补0) -52
位模式:11011001(-39)
进行算术左移位后:10110010(符号位被以前的第二位1替换了,最右边补0) -78
逻辑运算和逻辑位移为我们提供了操作位模式的工具。请看下文:
假设有一个模式在判断过程中需要用此模式的第三位(h g f e d c b a),也就是说我们需要知道这个 c 到底是 0 还是 1.
操作方法:
逻辑右移一次: 0 h g f e d c b
逻辑右移第二次: 0 0 h g f e d c
AND 0 0 0 0 0 0 1
如果结果是 0 ,那么目标位就是 0; 反之如果结果是 1 ,则目标位是 1
平时的开发位模式运算用的比较少~~~ C\C++底层中用的比较多,节省资源,提升"效率"~
笔者手打本文,各方资料请参考: && 《计算机科学导论》