位运算符
位运算符
进制
二进制(BIN):0~1 满二进1 以0b开头作为标识 0b00101
八进制(OCT):0~7 满八进1 以0开头作为标识 07 015
十进制:0~9
十六进制(HEX): 0-9 a~f 满十六进一 以0x开头作为标识 0xabc
进制的相互转换:
十进制转换成二进制: 不断除以2取余,然后将余数倒排

二进制转换成十进制:从低位次起,按位次乘以2的位次次方,然后求和
101 = 1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 = 1 + 0 + 4 = 5
十进制向哪个进制转换就除以哪个进制,然后取余倒排
二进制向八进制转换:从低位次起,每三位化为一组,产生一位八进制数字,最高位不足三位,补0。三位以内,按照二进制向十进制的转换规则进行运算,产生的八进制数字按顺序排列。
010 011 101 = 0235
八进制转换成二进制:一变三的过程 每一位八进制转换成三位二进制数字,然后按照顺序排列
235 = 010 011 101
二进制转换成十六进制:四变一的过程:从低位次起,每四位化为一组,产生一位十六进制数字,最高位不足四位,补0。四位以内,按照二进制向十进制的转换规则进行运算,产生的十六进制数字按顺序排列
0001 1011 1011 = 0x1bb
十六进制转换成二进制:一变四的过程:类比八进制
原码、反码、补码
所有的数据在底层都是二进制数据的补码形式储存的
对于正数来说,原码反码和补码是一样的
符号位1代表是负数,0代表正数
负数的反码是在原码的基础上符号位不变,其他位按位取反
负数的补码是在反码的基础上加1
原码
| 符号位 | 数值位 | |
|---|---|---|
| -5 | 1 | 0000101 |
| 5 | 0 | 0000101 |
反码
| 符号位 | 数值位 | |
|---|---|---|
| -5 | 1 | 1111010 |
| 5 | 0 | 0000101 |
补码
| 符号位 | 数值位 | |
|---|---|---|
| -5 | 1 | 1111011 |
| 5 | 0 | 0000101 |
位运算符
前提是要把数据转换成二进制的补码进行运算,效率高
- 按位与: & 两个操作数中都是1,结果才是1,否则结果就是0
- 任意一个数&1,如果结果是0,那么一定是偶数
- 任意一个数&一个偶数,结果一定是偶数
- 按位或: | 两个位只要有一个是1,结果就是1,如果都是0,结果才是0
- 任意一个数|一个奇数,结果一定是奇数
- 任意一个数|0,结果还是自身
- 按位异或: ^ 两个操作数中,相同就是0,不同就是1
- 任意一个数异或自身就是0
- 任意一个数异或0就是自身
- 左移: << 向左边移动n位,左边的舍弃,右边补0
- 左移n位就是乘以2的n次方
0000 0011
00 001100
- 右移: >> 向右边移动n位,右边丢弃,左边补位(正数补0,负数补1)
- 对于正数来说,右移n位就是除以2的n次方
原码:1000 0101
反码:1111 1010
补码:1111 1011
111111 10
反码:11111101
原码:10000010
- 无符号右移: >>> 和右移类似,但是最高位统一补0
- 取反: ~ ~i = -i - 1

浙公网安备 33010602011771号