[英]Moving and flipping bits
我需要通过位操作来转换输入数字。 以下是规则:
这是一个翻译表:
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
根据您的规格
位 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.