[英]Moving and flipping bits
我需要通過位操作來轉換輸入數字。 以下是規則:
這是一個翻譯表:
Input Input (bin) Output Output (bin)
0 0000 11 1011
1 0001 3 0011
2 0010 15 1111
3 0011 7 0111
4 0100 9 1001
5 0101 1 0001
6 0110 13 1101
................................
這是我嘗試過的:
def tr(n):
return ((n & 1 ^ 1) << 1) | ((n >> 1 & 1) << 2) | \
((n >> 2 & 1 ^ 1) << 3) | 1
tr(0)
給出了正確的數字:11,但tr(1)
給出了我 9。我頭痛地坐在這里 3 個小時,不明白出了什么問題。 對不起,如果這是微不足道的事情,或者這是一些愚蠢的錯誤。 請幫忙。
下面給出了你的翻譯表的相應結果:
def tr(n):
return 1 | ((n&4)>>1) ^ 2 | (n&2) << 1 | ((n&1) << 3) ^ 8
為了更好地理解:
位 0 應該是 1 -> 1
位 1 應該是輸入的翻轉位 2。 首先選擇位 2: n&4
然后將它從位 2 移到位 1: (n&4)>>1
最后翻轉位 1 的值 (2**1=2): ((n&4)>>1) ^ 2
。
位 2 應該是輸入的位 1。 首先選擇第 1 位: n&1
然后將其從第 1 位移至第 2 位: (n&2) << 1
位 3 應該是輸入的翻轉位 0。 首先選擇位 0: n&1
然后將它從位 0 移動到位 3: (n&1) << 3
最后翻轉位 3 的值 (2**3=8): ((n&1) << 3) ^ 8
根據您的規格
位 1 應該是輸入的翻轉位 2;
位 2 應該是輸入的位 1;
位 3 應該是輸入的翻轉位 0。
你的代碼應該是
def tr(n):
return (((n & 4) ^ 4) >> 1) | ((n & 2) << 1) |
((n & 1 ^ 1) << 3) | 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.