找出已更改的位数(按位运算符)
Finding out number of bits that have changed (bitwise operator)
我有一个根据用户输入生成的位串。我还有另一个位串,用于对生成的位串执行按位 &。我想知道的是如何从 & 操作中找出生成的位串中有多少位发生了变化。所以假设我有 10000101 作为生成的位串,00101111 作为我用于 & 操作的第二个位串。该过程的输出应为 1,因为只有生成位串的第一位发生了变化。我怎么做?
你要找的是按位异或(异或),或者a^b
:
10000101 ^ 00101111 → 10101010
在逻辑上等同于(~a&b) | (a&~b)
您需要将结果与原始结果进行异或以确定更改了哪些位:
changedBits = (userInput & generatedInput) ^ userInput
然后,你需要计算changedBits
值的Hamming Weight:
int hammingWeight(int i) {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
return (((i + (i >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;
}
int numberOfChangedBits = hammingWeight(changedBits);
根据您输入的位数进行调整。
我有一个根据用户输入生成的位串。我还有另一个位串,用于对生成的位串执行按位 &。我想知道的是如何从 & 操作中找出生成的位串中有多少位发生了变化。所以假设我有 10000101 作为生成的位串,00101111 作为我用于 & 操作的第二个位串。该过程的输出应为 1,因为只有生成位串的第一位发生了变化。我怎么做?
你要找的是按位异或(异或),或者a^b
:
10000101 ^ 00101111 → 10101010
在逻辑上等同于(~a&b) | (a&~b)
您需要将结果与原始结果进行异或以确定更改了哪些位:
changedBits = (userInput & generatedInput) ^ userInput
然后,你需要计算changedBits
值的Hamming Weight:
int hammingWeight(int i) {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
return (((i + (i >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;
}
int numberOfChangedBits = hammingWeight(changedBits);
根据您输入的位数进行调整。