java bit 位移规律总结
/** 例如:int i = 1; i占用 4 字节,1字节 = 8bit, 32位,bit(正整数 = 00000000 00000000 00000000 00000001 负数=11111111 11111111 11111111 11111111) 数字(num) bit 1 ====== 1 2 ====== 10 3 ====== 11 4 ====== 100 5 ====== 101 6 ====== 110 7 ====== 111 8 ====== 1000 9 ====== 1001 10 ====== 1010 11 ====== 1011 12 ====== 1100 13 ====== 1101 14 ====== 1110 15 ====== 1111 16 ====== 10000 ... ====== ... 2147483632 ====== 1111111111111111111111111110000 2147483633 ====== 1111111111111111111111111110001 2147483634 ====== 1111111111111111111111111110010 2147483635 ====== 1111111111111111111111111110011 2147483636 ====== 1111111111111111111111111110100 2147483637 ====== 1111111111111111111111111110101 2147483638 ====== 1111111111111111111111111110110 2147483639 ====== 1111111111111111111111111110111 2147483640 ====== 1111111111111111111111111111000 2147483641 ====== 1111111111111111111111111111001 2147483642 ====== 1111111111111111111111111111010 2147483643 ====== 1111111111111111111111111111011 2147483644 ====== 1111111111111111111111111111100 2147483645 ====== 1111111111111111111111111111101 2147483646 ====== 1111111111111111111111111111110 2147483647 ====== 1111111111111111111111111111111 */ /** * 正整数位移规律 * 1:int 正数 max(2147483647=(1 << 31) -1) bit = 1111111111111111111111111111111(31位),如果为32位,bit=10000000000000000000000000000000(32位,是负数), * min(1) bit=00000000000000000000000000000001(31位),高位的0被省略了,所以才31位。 * 2: 参考数字(1,2,3,4,5,6):bit 正数最高位为0(正数), 负数最高位为1(负数) * 3: 参考数字(1,2,3,4,5,6):bit 奇数 bit 低位=1, 偶数 bit 低位=0,加法算法规律,bit低位逢1高位补1,低位变0,逢0变1 * 4: 参考数字(2,4,8,16):1 << n, bit = 1 + n个0, 1 >> bit = 1- n个0 * 5: 参考数字(1,3,7,15):(1 << n)-1, num * 2 + 1的数字bit位都是1。 * * 6: 或(|): 0 | 0 =0, * 1 | 0 = 1, * 1 | 1 = 1。如果相同位有一个位为1,则为1,否则为0。 * int num = (1 << n)-1, n < num, 那么num | n = num。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为(1 << n)-1。 * int num = (1 << n)-1, n > num, n必须再(2 << n)-1范围。那么num | n = (2 << n)-1 。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为(2 << n)-1。 * 注意:只有(1 << n)-1满足这个规律。 * 7: 与(&): 0 & 0 = 0, * 1 & 0 = 0, * 1 & 1 = 1, 如果相同位都为1,则为1,否则为0。 * int num = (1 << n)-1, n < num, 那么num & n = n。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为n。 * int num = (1 << n)-1, n > num, 那么num & n = (0-num)范围 。 * 注意:只有(1 << n)-1满足这个规律。 * 8: 异或(^): 1 ^ 0 = 1, * 0 ^ 0 = 0, * 1 ^ 1 = 0, 两个位必须不相同 * 9: 取反(~): ~7 = -8, * ~5 = -6, * ~6 = -7,所有的正数变负数,因为高位为0,取反为1,变负数。 */