Отразить k-й значащий бит - PullRequest
0 голосов
/ 23 октября 2019

Я хотел бы найти лучший способ добиться следующего:

n = 6
k = 1

Flip the 1st significant bit in 6

Variable      Binary representation      Decimal Representation
       n                        110                           6
m(result)                       010                           2

Я хотел бы добиться того же, что и в этой вики-статье

Здесьэто то, что я сделал, но я нахожу это немного излишним, неэффективным:

def toggleKthSignificantBit(self, n, k):
        tmp = list(bin(n)[2:].zfill(3))
        tmp[k-1] = str(int(tmp[k-1]) ^ 1)
        tmp2 = ''.join(tmp)
        print(tmp2)
        return int(tmp2, 2)

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Предполагая, что k является позицией бита

Тогда это должно сделать трюк

x=n^(2**k)
bin(x)

ADDENDUM: если мы считаем биты слева, то мы можем сделать следующее

x = n^(2**(int(n).bit_length()-k))
bin(x)
0 голосов
/ 23 октября 2019

После некоторого экзамена я нашел решение для моего вопроса:

Однако, я думаю, я нашел эквивалентное решение:

n ^ (2**(butterfly_rank - k))
0 голосов
/ 23 октября 2019

IIUC возможно

n ^ 2**(len(bin(n)) - (2 + k))

def toggle_kth_left_to_right(n, k):
    res = n ^ 2**(len(bin(n)) - (2+k))
    return bin(n)[2:], bin(res)[2:]

# toggle_kth_left_to_right(6, 1)
# ('110', '10')

# toggle_kth_left_to_right(6, 2)
# ('110', '100')

# toggle_kth_left_to_right(6, 3)
# ('110', '111')
...