位,计算机可以处理的最小的单位就是位。Bit。
每一个位,就是一个开关状态,只有0和1两种状态。
针对位级别的运算,就是位运算。
由于只有两个状态,类似于布尔值的运算——逻辑运算:
按位非,按位与,按位或,按位异或。结果是:假设0为false,1为true。
平时的操作,不能针对一个位进行操作!只能针对一组位进行运算。例如一个整型4个字节,32个位,因此如果整型之间进行位运算,则需要进行32次。
按位非:~
按位与:&
按位或:|
按位异或:^
注意,现代计算器,几乎都是补码计算机。采用补码的形式保存数据。
相关的概念:
原码:直接表示数据值的编码形式。
5:0 … 00000101
-5: 1 … 00000101
反码:原码的取反,符号位不变。
5:0 … 00000101(正数反码与原码一致)
-5:1 111.. 11111010
补码:反码 + 1
5: 0 … 00000101(正数补码与原码一致)
-5: 1 111.. 11111011
总结,正数的原码,反码,补码一致,而负数的会发生变化。计算机在存储和计算时使用补码。
补 = 反(原码取反) + 1
补 = ~原 + 1;
原 = ~(补 - 1)
为啥采用补码:
5 – 3 = 2;
计算器只有加法器,没有减法器,所有的减法都改成相应的加法:
5 + (-3) = 2
通过原码,和补码进行模拟:
原码:
5: 0 00000101
-3: 1 00000011
+
1 00001000 -8
补码:
5: 00000000 00000000 00000000 00000101
-3: 11111111 11111111 11111111 11111101
+
00000000 00000000 00000000 00000010 (2)
正负0:
0 00000000
1 00000000
移位操作:
32位整体向左或者向右移动。
溢出丢弃,不够的补0;
左<< 需要移动的位数
右>>需要移动的位数