1. 补码
由于CPU在进行设计的时候只进行了加法器的设计,所以在它只会处理加法操作,那么问题来了如何进行减法操作呢?例如:A-B,我们可以将其看作是A+(-B)的形式。这样在计算机内部就会出现负数的形式,所以就引入了补码的概念,补码就是对数字进行按位取反再加一的操作,补码在计算机中进行储存负数。
2. 移位运算
1. 左移
就是将二进制中的bit位向左移动一位,低位用0进行填充,高位越界后舍弃。
2. 右移
1. 算数右移
就是将二进制中的bit位向右移动一位,高位用符号位进行填充,低位越界后舍弃。值得注意的一点-3>>1=-2, -3/2 = -1,算数右移按照向下取证的观点,除法运算按照向0取证的观点。
2. 逻辑右移
就是将二进制中的bit位向右移动一位,高位用0进行填充,低位越界后舍弃。
3. 二进制状态压缩
将一个长度为m的bool数组用二进制整数的每一bit位来表示并存储的方法。
常用操作:
1. 取出n的第k位bit的数值:n>>k & 1
2. 取出n的0-k位的数值:n & ((1 << k) -1)
3. 将n的第k位进行取反操作:n ^ (1 << k)
4. 将n的第k位赋值成1:n | (1 << k)
5. 将n的第k位赋值成0:n & (~(1<<k))
4. 成对交换
我们对n进行n^1的操作时发现,如果n为奇数这个操作可以转化成与他相邻的偶数,n ^ 1 ^ 1这样可以得到n本身,这样的数字交换称为成对交换。
5. lowbit运算
lowbit(n)表示非负数的最后一位1表示的数值是多少
inline int lowbit(int n){
return n & -n;
}