代码之家  ›  专栏  ›  技术社区  ›  Michael

移动和翻转位

  •  2
  • Michael  · 技术社区  · 7 年前

    我需要逐位转换一个输入数字。规则如下:

    • 位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个小时,头疼,不明白怎么了。对不起,如果这是一些琐碎的事情,或者这里是一些愚蠢的错误。请帮忙。

    2 回复  |  直到 7 年前
        1
  •  1
  •   T.Lucas    7 年前

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

    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&P;1 然后将其从0位移动到3位: (n&1) << 3 最后翻转位3的值(2**3=8): ((n&1) << 3) ^ 8

        2
  •  0
  •   Alain Merigot    7 年前

    根据你的规格

    位1应为输入的翻转位2;

    位2应为输入的位1;

    位3应该是输入的翻转位0。

    你的代码应该是

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