繁体   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