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


位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


为了更好的理解:


位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

10-04 14:23