0%

位运算

这里讲述 python 的基础,位运算。

首先在Python中可以通过以"0b"或者"-0b"开头的字符串来表示二进制。

print(0b0011)
    3
print(-0b0011)
    -3

例子如下:

a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a  = 1100 0011

注意:负数按补码形式参加按位与运算。

正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。

10000000 00000000 00000000 00000101 是 -5的 原码。
除符号位外,各位取反
11111111 11111111 11111111 11111010
然后 + 1
11111111 11111111 11111111 11111011 是 -5 的补码
  • 反码有正负 0 的区分
  • 补码没有正负 0 的区分

进制转化

print("十进制数为:", dec)
print("转换为二进制为:", bin(dec))
print("转换为八进制为:", oct(dec))
print("转换为十六进制为:", hex(dec))
print(bin(-3))
    -0b11

&

按位与运算符:参与运算的两个值

两位同时为1,结果才为1,否则结果为0

  • 0&0=0
  • 0&1=0
  • 1&0=0
  • 1&1=1

取一个数的指定位

比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。

print(bin(5))
    0b101
print(bin(-5))
    -0b101
print(5 & 0b0011)
print(0101 & 0011) = (0001) = 1
    1
print(-5 & 0b0011)
print(1011 & 0011) = (0011) = 3 「查看负数的补码」
    3
}

判断奇偶

取余数 n%2 等价于 判断二进制最右一位值 n&1

1 的二进制是 b:0001

假设为 3 ,其二进制为 b:0011 当进行如下操作的时候

0011 & 0001 = 0001 = 1
n & 1 = n % 2 = 1

假设为 4 ,其二进制为 b:0100 当进行如下操作的时候

0100 & 0001 = 0000 = 0
n & 1 = n % 2 = 0

|

按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。

  • 0|0=0
  • 0|1=1
  • 1|0=1
  • 1|1=1

常用来对一个数据的某些位设置为1

比如将数 X=1010 1110 的第4位设置为1,只需要另找一个数Y,令Y的第4位为1,其余位为0,即Y=0000 1111,然后将XY进行按位或运算(X|Y=1010 1111)即可得到。

^

按位异或运算符:当两对应的二进位相异时,结果为1。

异或的性质

两个数字异或的结果a^b是将 ab 的二进制每一位进行运算,得出的数字。 运算的逻辑是

  • 如果同一位的数字相同则为 0,不同则为 1

异或的规律

  • 任何数和本身异或则为0 a^b^b=a^0=a;
  • 任何数和 0 异或是本身 x^x=0,x^0=x
  • 满足交换律
  • 满足结合律 (a^b)^c == a^(b^c)

~

按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1

<<

左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

print(5 << 2)
    20
    5 = 0101 << 2 = 010100 = 20
print(-5 << 2)
    -20
    -5 = 11011 << 2 = 1101100 还原成原码 110100 = -20

>>

右移动运算符:把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

操作数每右移一位,相当于该数除以2。

print(5 >> 2)
    1
    5 = 0101 >> 2 = 0001 = 1
print(-5 >> 2)
    -2
    -5 = 11011 >> 2 = 11110 补码还原成原码 10010 = -2

a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0
c = a & b;        # 12 = 0000 1100
c = a | b;        # 61 = 0011 1101 
c = a ^ b;        # 49 = 0011 0001
c = ~a;           # -61 = 1100 0011
c = a << 2;       # 240 = 1111 0000
c = a >> 2;       # 15 = 0000 1111
请我喝杯咖啡吧~