這裏爲特定格雷碼單調排序幼稚測試(二進制反射格雷碼):
// convert Gray code binary number to base 2 binary number
int Base2(byte Gray){ Gray^=Gray>>4; Gray^=Gray>>2; return Gray^=Gray>>1; }
// test if Gray codes are consecutive using "normal" base 2 numbers
boolean GraysAdjacent(byte x, byte y){ return 1 == abs(Base2(x)-Base2(y)); }
尤其參見此答案(最好):
How to find if two numbers are consecutive numbers in gray code sequence
編碼在C作爲:
int GraysTouch(byte x, byte y){ return !((x^y^1) && (x^y^(y&-y)<<1)); }
// test x marks the spots! (where they touch!)
for(int i=31; i>-1; --i)
for(int j=31; j>-1; --j)
Serial.print((String)(GraysTouch(i^i>>1, j^j>>1)?"x":".") +
(GraysTouch(j^j>>1, i^i>>1)?"X":".") + (j?"":"\n"));
如何這個作品:...將被解釋,並且不是的OP代碼,因爲它是高度可疑的(請參閱下面的注意事項評論)。
的XOR
一個屬性,又名^
操作者,是匹配該位是0
和比特是不同的是1
。
1^0 == 0^1 == 1
1^1 == 0^0 == 0
此外,對於位,0 XOR b
作品的身份功能或者乾脆b
和
1 XOR b
作品補(沒有恭維討好)函數或~b
。
id(x) == x == x^0
opposite(x) == ~x == x^11111111 Why eight 1's? Are eight enough?
當比較XOR
兩個位串,這是不同的XOR
爲1
位,否則位必須賽和XOR
是0
:
0101 0001111001100111000
XOR 0011 XOR 0001111001100000111
------ ---------------------
0110 0000000000000111111
這解釋了該x^y
部分上面的代碼。
----------------------------------------------- -----------------------
撇開:
n^n>>1
做了一個從基2二進制快速轉換爲此處使用的格雷碼二進制數。
還要注意f(a,b)=a^b^b=a
對於任何b
都是冪等的!
就地掉期然後是a=a^b; b=a^b; a=a^b;
。
展開c=a^b; d=c^b; e=c^d;
即。 d=a^b^b=a; e=a^b^a=b;
---------------------------------------------- ------------------------
現在,通過定義,對於兩個格雷編碼編號,是相鄰的或連續存在必須只有一個可以改變和不同的位。
例子:
Johnson
Code
000 000 000 000
001 001 001 100
011 101 011 110
111 111 010 010
110 011 110 011
100 010 111 111
110 101 101
100 100 001
^^^
this Gray coding
is the one used here
仔細檢查它。
案例1
當連續編號的最低位,x
和y
,爲格雷碼中的任何,是不同的,其餘必須是一樣的!這是格雷碼的定義。這意味着x^y
必須看起來像0000 ... 0001。
還記得補充,~
功能又名1^b
?要測試最後一位x^y
是XOR
'd與1
。
這解釋了x^y^1
。
-------------------------------------------
案例2
連續格雷碼x
和y
中不同位的位置不是最低位。仔細看這些格雷碼連續數字。
001 010 101 lower order bits all match
011 110 111
| | | <-- | mark location of lowest 1
010 100 010 <-- XOR's
有趣的是,在此格雷碼,當最低階位匹配x
和y
,所以也沒有最低階1
的位置。
更有意思的是,對於連續的數字,位總是不同(這個格雷碼)在下一個高階位的位置!
所以,x^y
看起來???...?1000...0
其中1000...0
必須至少有一個0,10
(爲什麼?)和???...?
是謎位,對於連續格雷碼號必須是000...0
。 (爲什麼呢?即是連續x^y
必須看起來像......)
的觀察是,
x^y looks like ???...?100...0 if and only if
x and y look like ???...?:10...0
| <-- remember? the 1 location !!
的|
位置可以通過x&-x
或y&-y
被發現。 (爲什麼?爲什麼-
必須使用二進制補碼機完成?)
但是,必須檢查:
位置,看看它是1
(爲什麼?)和???...?
是000...0
。 (爲什麼?)
所以,
x^y looks like ???...?100...0 and
(y&-y)<<1 looks like 000...0100...0
,這解釋了x^y^((y&-y)<<1)
測試。
----------------------------------------------- --------------------
爲什麼這個工程:...是這裏使用的特定格雷碼的屬性的結果。考慮和解釋過於複雜,以至於爲什麼格雷碼應該具有這些屬性。
--------------------------------------------- -------------------------
由於OP代碼問題導致的以往答案不足之處的評論。
買者1:只要是明確的,在OP的問題的算法:
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;
}
具有連續的格雷碼一個有趣的解釋。當任何兩個二進制序列在一個位的位置不同時,它會正確報告。
如果通過連續代碼表示格雷碼用於列舉單調排序,則存在問題。
具體來說,代碼將返回true
所有這些對:
000, 001 or 000, 010 or 000, 100
這樣的順序可能是001, 000, 010
但隨後在哪裏可以100
去了? 算法報告(正確)001 or 010
的100
的「連續性」爲false
。
因此100
必須立即之前或之後在枚舉000
但不能立即之前或之後001
或010
。 DOH !!!
買者2:注x = (byte)(x & (x-1))
重置的x
的最低順序1位到零。
裁判:
Gray code increment function
Deriving nth Gray code from the (n-1)th Gray Code
https://electronics.stackexchange.com/questions/26677/3bit-gray-counter-using-d-flip-flops-and-logic-gates
How do I find next bit to change in a Gray code in constant time?
How to find if two numbers are consecutive numbers in gray code sequence
[如何找到,如果兩個數值都以格雷碼序列連續編號(HTTP的可能重複://計算器.com/questions/27218894/how-to-two-numbers-are-consecutive-numbers-in-gray-code-sequence) – Morwenn
N請注意格雷碼中的兩個相鄰點只有一個比特(這是您計算的功能)有所不同,但在格雷碼中兩個不同的比特並不總是相鄰的:格雷碼1000和1010僅相差一個比特,但不是鄰居(1000和1010分別是十進制的15和12)。 – Morwenn