位运算符

位运算符

进制

二进制(BIN):0~1 满二进1 以0b开头作为标识 0b00101

八进制(OCT):0~7 满八进1 以0开头作为标识 07 015

十进制:0~9

十六进制(HEX): 0-9 a~f 满十六进一 以0x开头作为标识 0xabc

进制的相互转换:

十进制转换成二进制: 不断除以2取余,然后将余数倒排

image-20250625101439202

二进制转换成十进制:从低位次起,按位次乘以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
posted @ 2025-07-04 22:53  小胡coding  阅读(20)  评论(0)    收藏  举报