簡體   English   中英

(〜)為什么我的位沒有翻轉?

[英](~) 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 FalseTruebool ,它是int的子類。 它們可以很容易地用於計算,但是對於你喜歡獲得正確的0秒和1秒的情況,或者如果你需要它們來索引dictint(not x)可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM