移动和翻转位

2024-04-26 12:11:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 位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。我头痛坐了三个小时,不知道怎么了。抱歉,如果这是一些琐碎的事情或者这里有一些愚蠢的错误。请帮忙。你知道吗


Tags: inputoutputreturnbin规则def错误数字
2条回答

下面给出了翻译表的相应结果:

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

根据你的规格

bit 1 should be the flipped bit 2 of input;

bit 2 should be the bit 1 of input;

bit 3 should be the flipped bit 0 of input.

你的代码应该是

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

相关问题 更多 >