我需要通过位操作来转换输入数字。规则如下:
位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