[英]Bitwise operator ~ isn't simply "flipping bits" in python. Why is that?
[英](~) Why are my bits not flipping?
我認為〜應該將1s變為0,反之亦然。 我在我的代碼中使用它,但我得到-2s和-1s。
def inverse_graph(graph):
# for each vertex in graph
revg = list(graph)
for i, line in enumerate(revg):
for j, vertex in enumerate(line):
if i != j:
# flip value
graph[i][j] = ~ graph[i][j]
#if vertex == 0:
# graph[i][j] = 1;
#else:
# graph[i][j] = 0;
return revg
def test():
g1 = [[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 1, 0]]
assert inverse_graph(g1) == [[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 0]]
g2 = [[0, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 0]]
assert inverse_graph(g2) == [[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
.................................................. .................................................. .................................................. .................................................. .....
實際上,-2 是 〜1。 兩個補充 ,還記得嗎?
>>> bin(1)
'0b1'
>>> bin(~1)
'-0b10'
問題是:你不是使用比特,而是使用整數。 所以要么你想要恢復使用例如布爾(看起來不那么好),要么你想使用像0 if x else 1
表達式, 0 if x else 1
來翻轉你的元素。
提示:您可以使用理解來更優雅地編寫:
>>> flipped = lambda graph: [ [0 if x else 1 for x in row] for row in graph]
>>> flipped( [ [1, 0], [0, 1] ] )
[[0, 1], [1, 0]]
隨着numpy
它更容易。
>>> import numpy as np
>>> g1=np.array([[0, 1, 1, 0],
... [1, 0, 0, 1],
... [1, 0, 0, 1],
... [0, 1, 1, 0]])
>>> g2=1-g1
>>> g2
array([[1, 0, 0, 1],
[0, 1, 1, 0],
[0, 1, 1, 0],
[1, 0, 0, 1]])
〜將使用布爾數據類型:
>>> g1=np.array([[0, 1, 1, 0], # 1 represents True and 0 represents False
... [1, 0, 0, 1],
... [1, 0, 0, 1],
... [0, 1, 1, 0]], dtype=bool)
>>> ~g1
array([[ True, False, False, True],
[False, True, True, False],
[False, True, True, False],
[ True, False, False, True]], dtype=bool)
如果你想在0和1而不是在真假的complement(~)
,這將做的伎倆:
>>> ~g1+0
array([[1, 0, 0, 1],
[0, 1, 1, 0],
[0, 1, 1, 0],
[1, 0, 0, 1]])
正如xtofl所指出的,Python的整數使用二進制補碼表示。 這意味着0
的按位反轉不是1
,而是無限長的二進制1
s序列,它被解釋為-1
。 1
的倒數不是0
,而是無窮多的1,后跟一個零(即-2
)。
當然,為每個整數存儲的位數不是無限的。 Python中,通常會使用C整數類型long
,你的系統定義(通常是32或可能64位長),但操作會溢出反而會自動切換到Python的任意精度的long
型如果值太大,不適合(這種轉換在Python 3中的int
類型中透明地處理。
無論如何,另一種解決方案是使用:
graph[i][j] = 1 - graph[i][j]
或者,如果您不介意值成為int
子類型bool
實例:
graph[i][j] = not graph[i][j]
Python的bool
值仍可用作數字( False
就像0
一樣, True
就像1
)。 唯一真正的區別是它們會用文字而不是數字打印出來。
雖然其他的是正確的,但0 if x else 1
not x
或者可能是int(not x)
,則更容易說0 if x else 1
。
如果x != 0
not x
返回False
,否則返回True
。 False
和True
是bool
,它是int
的子類。 它們可以很容易地用於計算,但是對於你喜歡獲得正確的0
秒和1
秒的情況,或者如果你需要它們來索引dict
, int(not x)
可能會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.