对 C 中二进制的每一位值取反

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

所以我遇到了一个编码问题,程序要求我对二进制的每一位取反,例如,常规的按位取反将是这样的: 十 = 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个回答
1
投票

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

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

  2. 由此,

    创建一个掩码,其中 1 代表您要翻转的所有位,0 代表所有其他位。

  3. 与此掩码一起使用 XOR。

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