python - 移动和翻转位

标签 python bit-manipulation

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

  • bit 0 应该是 1;
  • bit 1 应该是输入的翻转后的bit 2;
  • bit 2应该是输入的bit 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. bit 0 应该是 1 -> 1

  2. 位 1 应该是输入的翻转位 2。首先选择位 2:n&4然后将其从第 2 位移动到第 1 位:(n&4)>>1最后翻转第1位的值(2**1=2):((n&4)>>1) ^ 2 .

  3. bit 2 应该是输入的 bit 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

关于python - 移动和翻转位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308810/

相关文章:

python - 使用 Beautiful Soup 在 Python 中递归地抓取网站的所有子链接

python - 列表对象没有属性列

c++ - 确定数的幂

Java - 按位比较和移位

python - 为什么 "browse"方法使用不存在的 ID 返回错误的记录集?

python - 如何从数据库表中删除在元组/列表中找不到 ID 的行

python - XPathEvalError : Unregistered function for matches() in lxml

python - 按位运算 : C vs. Python

有条件地设置或清除位

c - 找到最大数量的最快和最有效的方法。可以通过对数组的 2 个 DISTINCT 元素执行按位和获得