《深入理解计算机系统》阅读笔记三——位运算 逻辑运算 移位运算

位级运算

二进制位的布尔运算,这里查了网上的一个例子:用位级的异或运算来做两个变量的数值交换:
int a=3,b=5;
a=a ^ b;
b=b ^ a;
a=a ^b;
代码执行后:a为5,b为3
这是为什么呢?异或是如何交换的呢?
首先,我们看一下异或的原理:
a = 3 ^ 5;
3的二进制是0011,5的二进制是0101。异或发现两者的不同之处,所以a最终为0110。
了解了异或的基本原理后,接下来看上述的代码。
a=a ^ b;
这一句使得a被赋值为“数值a”与“数值b”的“差异值”。
然后:b=b ^ a;
这一句用异或利用“差异值”来还原a的数值,并赋值给b。此时b等于a先前的数值。
最后一句:a=a ^ b;
因为a仍然保存着“差异值”,这一句通过异或使得b的初始值被还原,并赋值给a。
这样,异或就将a与b的数值“巧妙”地交换了……
有时候,我们总以为某些事务很神奇。实际上也只是一种自然规律罢了。

位级运算的常见用法就是实现掩码运算,这里的掩码是一个位模式,表示从一个字中选出的位的集合,通过位运算取得特定的值

逻辑运算

逻辑运算也是或、与、非。这个和位运算容易混淆。逻辑运算是表达式返回值的运算,结果只有真和假,按位运算是二进制的位的0和1的运算

移位运算

向左或向右移动位模式,二进制数值10010101向左移动4位得到的值是01010000,也就是说向左移动k位,丢弃最高位的k位,并在右端补k个0。右移运算,有两种形式,逻辑右移和算数右移,逻辑右移在左端补k个0,而算数右移在左端补k个最高有效位的值。二进制数值10010101逻辑右移4位得到的值是00001001,算数右移4位得到的是11111001

你可能感兴趣的:(《深入理解计算机系统》阅读笔记三——位运算 逻辑运算 移位运算)