Python教程:按位运算符

Python教程:按位运算符

2015-01-29 作者: giser 浏览: 3628 次

摘要: 位(bit)就是单个的0或1,位是我们在计算机上所作一切的基础。计算机上的所有数据都是用位来存储的。 首先我们来看一下什么是与运算、或运算与异或运算: 与运算: & 当条件都为真时,才为真。 1 & 1 = 1;1 & 0 = 0; 0 & 0 = 0; 或运...

位(bit)就是单个的0或1,位是我们在计算机上所作一切的基础。计算机上的所有数据都是用位来存储的。 首先我们来看一下什么是与运算、或运算与异或运算:

与运算: & 当条件都为真时,才为真。

1 & 1 = 1;1 & 0 = 0;
0 & 0 = 0;

或运算: | 当有一个条件为真时,即为真

1 | 1 = 1;1 | 0 = 1;0 | 0 = 0;

异或运算: ^ 当相等是为0,不相等时为1 (字面上来解释,异或就是不相等时,做或运算,即不相等时为1,相等就默认为0了)

1^1=0 
1^0=1
0^0=0

Python中按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

  • 按位与 ( bitwise and of x and y ) & 举例:

5&3 = 1 解释: 101 11 相同位仅为个位1 ,故结果为 1

  • 按位或 ( bitwise or of x and y ) | 举例:

5|3 = 7 解释: 101 11 出现1的位是 1 1 1,故结果为 111

  • 按位异或 ( bitwise exclusive or of x and y ) ^ 举例:

5^3 = 6 解释: 101 11 对位相加(不进位)是 1 1 0,故结果为 110

  • 按位反转 (the bits of x inverted ) ~ 举例:

~5 = -6 解释: 将二进制数+1之后乘以-1,即~x = -(x+1),-(101 + 1) = -110

  • 按位反转仅能用在数字前面。所以写成 3+~5 可以得到结果-3,写成3~5就出错了。
  • 按位左移(x shifted left by n bits)<< 举例:

5<<2 = 20 解释:101向左移动2位得到10100,即右面多出2位用0补。

  • 按位右移 ( x shifted right by n bits)>> 举例:

5>>2 = 1 解释:101 向右移动2位得到 1,即去掉右面的2位

在优先级方面,取反运算符~跟算术运算符中的单目运算符(即 只有一个操作数参加运算)同级,并且是所有位运算符中优先级最高的;然后是移位运算符(左移<<和右移>>),它们比取反运算符和算术运算中的加减运算符低;最后是逐 位与、或和异或运算符。

各位运算符按照优先级有高到低排列如下所示:

取反运算符 > 左移运算符 > 右移运算符 > 按位与运算符 > 按位异或运算符 >

按位或运算符 在位运算符中,取反运算符(单目运算符)~的结合性是从右向左结合,其余双目运算符的结合性是从左向右结合。 下面是直接可以运行的代码,具体运行一下 ,会对Python中的位运算体会得更深一些。注意,因为Python是弱类型的编程语言,所以没有其它进制的数值表示,都是以字符串的形式来表现的。

    # -- coding:utf-8 -
    '''
    对整数转换成的二进制字符串进行格式化
    '''
    def formatbin(int_val):
        str_val = bin(int_val)
        if str_val.startswith('-'):
            return(str_val[0:1] + str_val[3:])
        return(str_val[2:])
    val_a = 53
    val_b = 26
    val_c = val_a & val_b
    print( ' ' * 3 + formatbin(val_a).zfill(6))
    print( '&  '   + formatbin(val_b).zfill(6))
    print('-' * 9)
    print(' ' * 3 + formatbin(val_c).zfill(6))
    print
    val_c = val_a | val_b
    print( ' ' * 3 + formatbin(val_a).zfill(6))
    print( '|  '   + formatbin(val_b).zfill(6))
    print('-' * 9)
    print(' ' * 3 + formatbin(val_c).zfill(6))
    print
    val_c = val_a ^ val_b
    print( ' ' * 3 + formatbin(val_a).zfill(6))
    print( '^  '   + formatbin(val_b).zfill(6))
    print('-' * 9)
    print(' ' * 3 + formatbin(val_c).zfill(6))
    print
    val_c = ~ val_a 
    print( '~  '  + formatbin(val_a).zfill(6))
    print('-' * 9)
    print(' ' * 2 + formatbin(val_c).zfill(6))
    print 
    val_c = val_a >> 1 
    print( '>> '  + formatbin(val_a).zfill(6))
    print('-' * 9)
    print(' ' * 4 + formatbin(val_c).zfill(5))
    print
    val_c = val_a << 1 
    print( '<< '  + formatbin(val_a).zfill(6))
    print('-' * 9)
    print(' ' * 2 + formatbin(val_c).zfill(6))

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org