一. 位运算
主要看一,二章
- 十/二进制互相转换
- 十进制->二进制
- 正数:正常, 除2取余 除2取余
- 负数: 补码 (先把它当成正数算2进制,然后各位取反,再+1) -1的补码全是11111
- 二进制->十进制
- 正数:正常 , 2的n次方
- 负数:同样 各位取反 ,再+1, 然后算十进制,最后加个负号 (连着符号位都取反,因为正数必带符号位0)
- 符号位:
- 最高位, 正数:0, 负数:1
对于 k 位整数,有符号整数的取值范围是 【-2的k-1次方, 2的k-1次方 -1 】
无符号整数的取值范围是 【0,2的k次方 -1】
位运算共有 6 种,分别是:与、或、异或、取反(非)、左移和右移
& | ^(按位异或 相同为0 不同为1) ~ << >>
移位运算按照移位方向分类可以分成左移和右移,按照是否带符号分类可以分成算术移位和逻辑移位。
左移运算的符号是 <<。左移运算时,将全部二进制位向左移动若干位,高位丢弃,低位补 00。对于左移运算,算术移位和逻辑移位是相同的。
右移运算的符号是 >>。右移运算时,将全部二进制位向右移动若干位,低位丢弃,高位的补位由算术移位或逻辑移位决定:
算术右移时,高位补最高位也就是符号位;
逻辑右移时,高位补 0。
对于 C/C++ 而言,数据类型包含有符号类型和无符号类型,其中有符号类型使用关键字 signed 声明,无符号类型使用关键字 unsigned 声明,两个关键字都不使用时,默认是有符号类型。对于有符号类型,右移运算为算术右移;对于无符号类型,右移运算为逻辑右移。
将一个数左移 k位,等价于将这个数乘以 2^k。而将一个数右移k位,对于0和正数是等价于将这个数除以2^k次方, 但是对于负数不成立。
位运算的优先级很低 切记,所以关于位运算最好都套个()
重要的性质
-1 是11111111, 0是000000, 最小整数是 1000000