反转C中二进制的每一位值

问题描述 投票:0回答:1

所以我遇到了一个编码问题,程序要求我反转二进制的每一位,例如,常规反转将是这样的: 10 = 00001010 反过来是 11110101 = 245,很好地实现这一点,在我看来,我可以将它与 255 进行异或。

但真正的问题是他们只要求反转它直到最后一个“1”。我的老师教我从右开始写二进制,所以如果数字是 10,最后一个“1”就是 2^3。

所以 10 = 1010 反过来就是 0101 = 5

另一个例子是

5 = 00000101 -> 只取最后一个“1”,即 2^2 所以就像忽略这个 ->[00000],只使用这个 ->[101]

所以现在 5 = 101 反转将是“010”,等于 2

我想知道是否有任何方法可以帮助我实现这个结果,起初我想到使用像这样的循环:

for(int i = 7; i >= 0;i--)

并将索引存储到一个 char 来表示二进制文件,并尝试从那里反转它,但当我看到约束是 n 时我很快停止<= 1000000

如何解决这个问题?

c bitwise-operators xor complement
1个回答
0
投票

您所说的“最后”位通常称为“最重要位”——与此名称不会混淆。

  1. 使用几种已知技术中的任何一种找到最高有效位。

    n = (int)log2(i - 1.0) + 1
    
    
  2. 由此创建一个掩码,其中 1 代表您要翻转的所有位,0 代表所有其他位。

    mask = (1 << (n + 1)) - 1
    
    
  3. 与此掩码一起使用 XOR。

    i ^= mask
    
    
上面的代码仅展示了想法,而不是确切的解决方案。它效率低下,并且可能包含相差一的错误。

© www.soinside.com 2019 - 2024. All rights reserved.