移动和翻转位

时间:2019-01-22 12:57:53

标签: python bit-manipulation

我需要通过位操作来转换输入数字。规则如下:

  • 第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个小时,无法理解是哪里出了问题。抱歉,这是一件小事,或者这是一些愚蠢的错误。请帮忙。

2 个答案:

答案 0 :(得分:1)

以下是翻译表的相应结果:

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 :(得分:0)

根据您的规格

  

位1应该是输入的翻转位2;

     

第2位应该是输入的第1位;

     

位3应该是输入的翻转位0。

您的代码应为

def tr(n):
  return (((n & 4) ^ 4) >> 1) | ((n & 2) << 1) |
  ((n & 1 ^ 1) << 3) | 1