zoukankan      html  css  js  c++  java
  • Python语言中的按位运算

    (转)位操作是程序设计中对位模式二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).

       简单来说,按位运算就把数字转换为机器语言——二进制的数字来运算的一种运算形式在计算机系统中,数值一律用补码来表示(存储)。

          Python中的按位运算符有:左移运算符(<<),右移运算符(>>),按位与(&),按位或(|),按位翻转(~)。这些运算符中只有按位翻转运算符是单目运算符,其他的都是双目运算符。

          按位与    &

               举例: 

                      3&5                        

                      解法:3的二进制补码是 11,  5的是101, 3&5也就是011&101,先看百位(其实不是百位,这样做只是便于理解) 一个0一个1,根据(1&1=1,1&0=0,0&0=0,0&1=0)可知百位应该是0,同样十位上的数字1&0=0,个位上的数字1&1=1,因此最后的结果是1.(这之后本来应该还有一步,因为我们现在得到的数值只是所求答案的补码,但是因为正数的补码即是它本身,所以就省略了。不过,下面的例子就不能省略最后这一步了).    

                      -1&-2

                       解法:-1的补码是11111111,  -2的补码是11111110, 11111111&11111110得到的结果是:11111110,这个是补码,再转化位原码为100000010 (负数转换位原码的方法是减一取反),最后转换为十进制是 -2.

                      -2&6   

                       解法:-2的补码是11111110,  6的补码是110,   11111110&110,也就是11111110&00000110(这样写的目的是让初学者能够更好理解按位运算),按照上面的方法得到的结果是:110,转化位十进制就是6.

              小技巧:利用按位与可以将任意二进制数的最后一位变为0,即就是X&0.

     

           

           按位并    |

     

     

              举例: 

                     4|7

                     解法:按位并的计算规律和按位与的很相似,只不过换了逻辑运算符,并的规律是: 1|1=1 ,1 |0=1, 0|0=0.   4|7转换位二进制就是:100|111=111.  二进制111即为十进制的7.

             小技巧:利用按位并可以将任意二进制数的最后一位变为1,即就是X|1.

            

             按位异或    ^

              方法:  对位相加,别要注意的是不进位.      

              举例: 

                       2^5

                       解法:10^101=111,二进制111得到十进制的结果是7.
                       

                       1^1

                       解法:1+1=0.(本来二进制1+1=10,但不能进位,所以结果是0) 

                       -3^4

                      

                        解法: -3的补码是11111101,4的补码是100 (也即00000100), 1111 1101^0000 0100=1111 1001,补码1111 1001转为原码是1000 0111,即十进制的-7.

     
             按位翻转  ~   
             
              方法:   将二进制数+1之后乘以-1,x的按位翻转是-(x+1) . 注意,按位运算符是单目运算符.  -9 ,  1+~4是正确的,5~3就不对了.
          这是更快捷的按位翻转算法,也可以按部就班每位按位取反(包括符号位),最后如果是负数再转为原码 
              举例:

                      ~3

                      解法:3的二进制是11, -(11+1)=-100B=-4D. (注:B和D分别表示二进制和十进制).

                      ~-2

                       解法:   -  (-10+1)  =1 【即(b)10 - 1 = 01】  【此方法不涉及补码】
         或者:-2在计算机中存储为补码:1111 1110,按位取反得~1111 1110 = 0000 0001即为1
     

           左移运算符  << 

               

               方法:    X<<N 将一个数字X所对应的二进制数向左移动N位.

               举例:

                     3<<2
       
                     解法:11向左移动两位变为1100,即12 .
     

            右移动运算符  >>

                 

               方法:    X>>N 将一个数字X所对应的二进制数向右移动N位.

                 

               举例:

     
             
                           3>>2
       
                           解法:11向右移动两位变为0.
     
                            10>>1
              
                            解法:10的二进制是1010,向右边移动一位是101,即5.
  • 相关阅读:
    数据库原理 第七章 数据库设计和ER模型
    jeecgboot常见问题及处理方法-found character '@' that cannot start any token. (Do not use @ for indentation)
    jeecgboot积木报表(jimuReport)Oracle切换
    datart表结构
    这几天找工作的经历
    Jenkins 无法登陆解决方法
    Nginx 部署前后端分离项目(SpringBoot Vue)
    CentOS7 用yum方式安装Nginx
    Centos 7 安装 MYSQL 8.0
    Centos 7 安装 JDK1.8
  • 原文地址:https://www.cnblogs.com/everest33Tong/p/6586634.html
Copyright © 2011-2022 走看看