KKK*_*KKK 1 java xor gray-code bitwise-xor
什么是"灰色代码连续"应该是什么意思?我的意思是10和11在十进制系统中是连续的,但什么是"灰色代码中的连续"含义?我只知道格雷码是一个二进制数字系统,其中两个连续值只有一位不同.
这是一个在线解决方案,但我无法理解这一点
private static int graycode(byte term1, byte term2) {
byte x = (byte)(term1^term2); // why use XOR?
int count = 0;
while(x!=0)
{
x = (byte)(x &(x-1)); // why use bitwise operator?
count++; // what is count?
}
return count == 1;
}
Run Code Online (Sandbox Code Playgroud)
我试着理解花了一个小时,但我仍然没有线索.
如果两个数字在它们的二进制表示中仅相差一位,则它们在格雷码中被认为是连续的,例如111和101仅相差第二位.您检查的函数是否有两个输入字节只有一个位使它们不同.因此111和101将从函数返回1,而111和100将返回0.
XOR用于找出两个数字之间的差异; 当比特不同时,XOR产生1,否则为0,否则例如1111 XOR 1011将产生0100.因此,对于XOR,每个比特差异在该位置由1突出显示.如果两个数字都是连续的格雷码,那么在XOR的结果中应该只有一个1.不止一个1表示多个差异因此不符合标准.XOR结果存储在变量中x.
接下来的任务是计算1的数量 - 因此变量count.如果你尝试其他灰色代码对(更长的位长),你会注意到获得的XOR值将始终采用这种格式(忽略前导零):10,100,1000等.基本上,1后跟零或者,换句话说,总是2的力量.
如果这些样本XOR结果减1,您将得到:01,011,0111等.如果这些新值与原始XOR结果进行AND运算,则每次都会得到0.这是你的解决方案中实现的逻辑:对于一个连续的灰色代码对,while循环只运行一次(和增量count),然后它将终止,因为它x已经变为0.所以count = 1最后.对于非连续对,循环将运行多次(尝试它)并且count在结束时将大于1.
该函数使用此作为基础,如果count== 1 则返回1,否则返回0.有点模糊,但它完成了工作.