我如何在Python中进行按位操作?

时间:2015-07-01 01:22:05

标签: python

为了测试使用更多基本构建块构建Xor操作(在我的例子中使用Nand,Or和And),我需要能够执行Not操作。内置not似乎只使用单个位来执行此操作。如果我这样做:

x = 0b1100
x = not x

我应该0b0011,但我得到的是0b0。我究竟做错了什么?或者Python只是缺少这个基本功能?

我知道Python有一个内置的Xor函数,但我一直在使用Python来测试HDL项目/课程的内容,我需要构建一个Xor门。我想用Python测试这个,但我不能没有相当于Not门。

6 个答案:

答案 0 :(得分:24)

在Python中使用~的问题在于它适用于有符号整数。这也是唯一真正有意义的方法,除非你将自己限制在特定的位数。使用按位数学 可以正常工作,但是它可能很难解释中间结果。

对于4位逻辑,您应该从0b1111

中减去
0b1111 - 0b1100  # == 0b0011

对于8位逻辑,从0b11111111等减去

一般表格是

def bit_not(n, numbits=8):
    return (1 << numbits) - 1 - n

答案 1 :(得分:3)

Python按位'〜'运算符将整数的所有位取反,但由于Python中的所有整数都带有符号表示,所以我们看不到本机结果。

我们可以间接地检查:

>>> a = 65
>>> a ^ ~a
-1

或相同:

>>> a + ~a
-1

结果为-1表示所有位均已设置。但是前面的减号不允许我们直接检查这个事实:

>>> bin(-1)
'-0b1'

解决方案很简单:我们必须使用无符号整数。 第一种方法是导入均支持无符号整数的'numpy'或'ctypes'模块。但是numpy比ctypes更简单(至少对我来说):

import numpy as np
a = np.uint8(0b1100)
y = ~x

检查结果:

>>> bin(x)
'0b1100'
>>> bin(y)
'0b11110011'

最后检查:

>>> x + y
255

8位整数(字节)的无符号整数“ 255”表示与“ -1”相同,因为所有位均设置为1。请确保:

>>> np.uint8(-1)
255

----------

另一种最简单的解决方案,不太正确,但是如果要包括其他模块,则可以使用XOR操作将所有位取反,其中第二个参数的所有位均设置为1:

a = 0b1100
b = a ^ 0xFF

此操作还将删除有符号整数的最高有效位,我们可以看到如下结果:

>>> print('{:>08b}'.format(a))
00001100
>>> print('{:>08b}'.format(b))
11110011

----------

最后的解决方案包含另外一项操作,因此不是最佳选择:

>>> b = ~a & 0xFF
>>> print('{:>08b}'.format(b))
11110011

答案 2 :(得分:2)

实现这一目标的另一种方法是分配一个这样的面具(应该全是1&#39;)

CommonCode cc = new CommonCode();
cc.createAdview(this);

然后用这样的数字xor它:

mask = 0b1111

你可以参考xor真值表来了解它的工作原理。

答案 3 :(得分:1)

试试这个,它被称为按位补码operator

{{1}}

答案 4 :(得分:0)

二进制字符串可以用来保留左边的0,因为我们知道:

bin(0b000101) # '0b101'
bin(0b101)    # '0b101'

此函数将返回输入数字非的字符串格式

def not_bitwise(n):
     ''' 
     n: input string of binary number (positive or negative)
     return: binary number (string format)
     '''
     head, tail = n.split('b')
     not_bin = head+'b'+tail.replace('0','a').replace('1','0').replace('a','1')
     return not_bin

示例:

In[266]: not_bitwise('0b0001101')
Out[266]: '0b1110010'

In[267]: int(not_bitwise('0b0001101'), 2)

Out[267]: 114

In[268]: not_bitwise('-0b1010101')

Out[268]: '-0b0101010'

In[269]: int(not_bitwise('-0b1010101'), 2)
Out[269]: -42

答案 5 :(得分:-1)

John La Rooy给出的一般形式可以用这种方式简化(python == 2.7和&gt; = 3.1):

def bit_not(n):
    return (1 << n.bit_length()) - 1 - n