我有两个字节,它们只有1位不同。我想知道这是什么。
所以:
byte a,b;
a=0;
b=2;
ChangedBit(a,b) should give bit 1
ChangedBit(4,5) should give bit 0
ChangedBit(7,3) should give bit 2
欢迎提出任何建议!!
谢谢,
埃里克
发布于 2011-03-30 09:30:47
正确的解决方案应该是这样做
var bit = Math.Log(a ^ b, 2);
当然,这留下了一个问题,如果由于任何原因,超过一个位是不同的,会发生什么。
你可以使用
var bit = (int)Math.Log(a ^ b, 2);
来获得最高不同位的索引,如果多个位不同。
警告:为确保正确性,任何此类函数在尝试提供结果之前还应检查两个参数a
和b
是否实际不同。否则,你要么得到一个毫无意义的结果,要么得到一个彻底的异常。这里给出的所有解决方案都是如此,包括这一个。
发布于 2011-03-30 09:29:38
如果它们相差一位,xor应该只给你这一位。然后你就可以转移去找哪一个?
也许需要一些优化:
static int ChangedBit(int x, int y)
{
uint bits = (uint)(x ^ y); // need uint to avoid backfill with shift
int count = -1;
while (bits != 0)
{
count++;
bits >>= 1;
}
return count;
}
发布于 2011-03-30 09:26:31
你可以很容易地做到这一点:
Math.Log(Math.Abs(a-b), 2)
更新:已修复...
https://stackoverflow.com/questions/5484452
复制