反码:
反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。
补码:
正整数的补码是其二进制表示,与原码相同。
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
已知一个数的补码,求原码的操作其实就是对该补码再求补码。
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
按位取反(实际是补码取反,再转换为原码):公式。
~x = -(x+1);
其他按位运算一样,要是有负数,就按补码运算。
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
若:sysconf(_SC_PAGE_SIZE ) = 4096, ~(sysconf(_SC_PAGE_SIZE) - 1) = -4096;
则:pa_offset = offset & (-4096)。
意义是什么?如下
例如:
int a = -7 &(-8),则a = 0;
int b = 16 & (-8), 则b = 16;
int c = 20 &(-8),则c = 16;
int b = 23 & (-8), 则d = 16;
int c = 24 &(-8),则e = 24;
明显,这是得到8的整数倍。
你不会还不知道按位取反运算的原理吧 - 知乎 (zhihu.com)