位运算符的运行过程(python),其他语言也一样

一、有6种为运算符

1.按位与 【&】:仅当两个位操作数都为1,输出结果才为1,否则都输出为0
2.按位或 【|】:仅当两个位操作数都为0,输出结果才为0,否则都输出为1
3.按位异或 【^】:仅当两个位操作数不同时,输出结果才为1,否则都输出为0
4.按位取反 【~】:将每一位取反,也就是1变成0,0变成1
5.按位左移 【<<】:m<<n,按位左移运算,m对应的二进制数的每位向左移动n位,后面补0
6.按位右移 【>>】:m>>n,即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0

二、Python中的位运算符与其它语言中的位运算符作用相同。

位运算符也称二进制运算符,并且这些运算符只用于对整型数进行运算。

进行位运算时,整型数被转换为二进制形式,然后位运算符对每位执行有关运算后,将结果再转换回十进制形式,并返回给用户。

(1)&:按位与运算

对应位上的二进制数进行与运算,如果参加位运算的两个二进制数为1,则结果为1,只要有一个为0,则结果为0,如10和4进行按位与运算,他们对应的二进制形式分别为:1010 和 0100,则:

   1 0 1 0
& 0 1 0 0
  -----------
   0 0 0 0

即10和4按位与运算的结果为二进制的0,也对应着10进制的0,最终结果即为0,即 10 & 4 = 0

再如,5和6进行按位与运算,其对应的二进制形式分别为: 101 和 110,

    0 1 0 1
&  0 1 1 0
-------------
     0 1 0 0

其运算结果为二进制的100,即十进制的4,也就是说: 5 & 4 = 4

Python的运行结果如下:

(2)|:按位或运算

按位或运算是二进制对应的每位进行或运算。如果对应的两位都为0,则结果为0,只要有一个为1,则结果为1。

10 和 4的或运算:

    1 0 1 0
|   0 1 0 0
   ------------
    1 1 1 0

其或运算的结果为二进制的 1110,对应着十进制的 14,即 10 | 4 = 14.

5 和 6的或运算:

    0 1 0 1
|   0 1 1 0
   ------------
    0 1 1 1

5 和 6的按位或运算结果为 0111,对应的十进制为 7 ,即 5 | 6 = 7

Python的运行结果如下:

(3)^:按位异或运算

按位异或运算,即对应的两个二进制位不同时,结果为1,否则为0.

10 和 4 的按位异或运算:

    1 0 1 0
^  0 1 0 0
   ------------
    1 1 1 0

即,结果为二进制1110,对应的十进制为14,亦即:10 ^ 4 = 14

5 和 6 的按位异或运算:

    0 1 0 1
^  0 1 1 0
   ------------
    0 0 1 1

0011对应的十进制数为3,也就是说: 5 ^ 6 = 3

Python中的运行结果:

 

 

(4)~:按位取反运算符【公式:-(原数+1)】例如:~10 = -(10+1) = -11

该运算是单操作数运算符,即其只需要一个操作数参与运算。运算时,二进制数上的每位取反,即1变为0, 0变为1.

这里涉及到数字在计算机中的存储形式,在计算机中,最高位为符号位,符号位为0时表示正数,符号位为1时表示负数。

计算依据:

①正数的原码、反码、补码都是一样的
②负数的补码为符号位不变,剩余位取反再加1
③原码求补码: 取反,+1
④补码求原码: 取反,+1
负数是以补码存储在计算机的
取反操作是在原码上进行的
⑦符号位,1表示负数,0表示正数

例:
~(-2)
首先你要知道 -2 在计算机里面的二进制形式,由⑤和②可知:
-2 原码:1000 0000 0000 0010
-2 反码:1111 1111 1111 1101 #符号位不变,各位求反
-2 补码:1111 1111 1111 1110 #补码 = 反码 + 1

1111 1111 1111 1110 就是-2在计算机里面的原型
现在开始对他求反,符号位不变,

按位取反: 0000 0000 0000 0001
很明显是一个正数,其原码为其本身,所以输出为1.

~2
2 原码,反码,补码: 0000 0000 0000 0010

按位取反: 1111 1111 1111 1101
这是一个负数该怎么办?能直接求吗?
很显然是不行的,⑥说了:取反操作计算结果是在原码上进行的,⑤也说了:负数是以补码存储的
1111 1111 1111 1101 是 0000 0000 0000 0010 的反码,但我们想要的是结果,而不是在计算机里面的原型,
恰好,④补码求原码: 取反,+1
取反: 1000 0000 0000 0010
加 1: 1000 0000 0000 0011
于是,我们得到了原码,可以计算结果了
1000 0000 0000 0011 = -3

10按位取反运算(第1位为符号位):

~ 0  1 0 1 0
  --------------
   1  0 1 0 1

结果最高位为1,为负数,因为负数在计算机中以补码形式存储,转换为原码(先减1,再按位反)为:

1 1011

即对应的十进制数为 -11,即: ~10 = -11.

5 按位取反运算:

~ 0  0 1 0 1
 ---------------
  1  1 0 1 0

结果对应的原码为: 1 0110,对应的十进制数为:-6,即:~5 = -6

Python中的运行结果:

 

 

(5)<<:按位左移运算符

其形式为:m<<n

按位左移运算,m对应的二进制数的每位向左移动n位,后面补0.

如10的二进制数 1010 向左移动两位后为:10 1000,其对应的十进制数为:40.

5的二进制数:0101,向左移动两位后为:1 0100,其对应的十进制数为:20

也就是说,一个整数左移n位相当于这个数 m×2的n次方

Python中的运算结果:

 

(6)>>:按位右移运算符

其形式为:m >> n

即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0.

10的二进制 1010 向右移动1位为:0101,即变为十进制的5;再移动1位变为0010,变为2,再移动1位变为0001,变为1,再移动就一直为0了。

即每向右移动1位,相当于原数除以2,只保留整数部分;移动n位,相当于原数除以2的n次方,只保留整数部分。

在Python中的运算结果:

上述就是6种二进制运算符的运行过程,其在计算机内部运算效率比其他运算符要高的。

 


版权声明:本文为zhougushen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。