为了测试使用更多基本构建块构建Xor操作(在我的例子中使用Nand,Or和And),我需要能够执行Not操作。内置not
似乎只使用单个位来执行此操作。如果我这样做:
x = 0b1100
x = not x
我应该0b0011
,但我得到的是0b0
。我究竟做错了什么?或者Python只是缺少这个基本功能?
我知道Python有一个内置的Xor函数,但我一直在使用Python来测试HDL项目/课程的内容,我需要构建一个Xor门。我想用Python测试这个,但我不能没有相当于Not门。
答案 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