簡體   English   中英

移動和翻轉位

[英]Moving and flipping bits

我需要通過位操作來轉換輸入數字。 以下是規則:

  • 位 0 應為 1;
  • 位 1 應該是輸入的翻轉位 2;
  • 位 2 應該是輸入的位 1;
  • 位 3 應該是輸入的翻轉位 0。

這是一個翻譯表:

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

為了更好地理解:

  1. 位 0 應該是 1 -> 1

  2. 位 1 應該是輸入的翻轉位 2。 首先選擇位 2: n&4然后將它從位 2 移到位 1: (n&4)>>1最后翻轉位 1 的值 (2**1=2): ((n&4)>>1) ^ 2

  3. 位 2 應該是輸入的位 1。 首先選擇第 1 位: n&1然后將其從第 1 位移至第 2 位: (n&2) << 1

  4. 位 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.

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