2016-02-29 56 views
0

什麼是「灰色代碼中的連續」應該表示什麼?我的意思是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; 
} 

我試着去了解花時間,但我仍然沒有線索。

+0

[如何找到,如果兩個數值都以格雷碼序列連續編號(HTTP的可能重複://計算器.com/questions/27218894/how-to-two-numbers-are-consecutive-numbers-in-gray-code-sequence) – Morwenn

+1

N請注意格雷碼中的兩個相鄰點只有一個比特(這是您計算的功能)有所不同,但在格雷碼中兩個不同的比特並不總是相鄰的:格雷碼1000和1010僅相差一個比特,但不是鄰居(1000和1010分別是十進制的15和12)。 – Morwenn

回答

4

兩個數字在其二進制表示例如考慮在連續的格雷碼如果它們不同僅由一個位111和101只有第二位不同。你有檢查兩個輸入字節只有一個位使它們不同的函數。因此,111和101將從函數返回1,而111和100將返回0.

XOR用於查找兩個數之間的差異;當位不同時異或產生1,否則產生0。 1111 XOR 1011會給出0100.所以在XOR中,每個位差在該位置被1突出顯示。如果兩個數字都是連續的灰色代碼,那麼在XOR的結果中應該只有一個1。不止一個1表示多重差異,因此不符合標準。異或結果存儲在變量x中。

接下來的任務是計算1的數量 - 因此變量爲count。如果您嘗試其他格雷碼對(比特長度較大),您會注意到所獲得的異或值將始終採用此格式(忽略前導零):10,100,1000等。基本上,1後面跟零或換句話說,總是2的冪。

如果這些樣本異或結果減1,您將得到:01,011,0111等。如果這些新值與原異或結果進行了與運算,0將是每次結果。這是您的解決方案中實現的邏輯:對於連續的灰色代碼對,while循環將只運行一次(並且增量爲count),之後它將終止,因爲x已變爲0.因此count = 1結束。對於非連續的對,循環將運行多次(嘗試),並且count將在結尾處大於1。

該函數以此爲基礎返回1,如果count == 1,否則返回0。 有點模糊,但它完成了工作。

1

這意味着兩個數字恰好在一個位上不同。

因此,解決方案是從兩個數字開始。異或運算結果爲1,其中操作數的位不同,否則爲零。

因此,您需要計算xor結果中的位數並與1進行比較。這就是您下載的示例所做的。由於Brian Kernighan的緣故,這種以二進制數來計數1的方法是一個相當有名的方法。狀態x = (byte)(x & (x-1))是有點神奇的,將最高階的1位重置爲零。 There are lots of others

或者,您可以用1位搜索8個可能字節的表。

byte one_bit_bytes[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; 
1

這是一種非常直觀的方法來計算二進制數中有多少位等於'1'。

它需要二進制算術的知識。開始時,你減去1這是由後面跟着一個或多個零「1」寫一個十進制數會發生什麼:你得到9的序列,其長度等於零的個數:

1000000 - 1 = 999999 

類似的事情發生在二進制數字。如果您從非負數的二進制數中減去1,則所有最低的'0'數字都將被替換爲'1',而在這些零之前的'1'將被替換爲零。這是從二進制借用的方式來的。例如:

0101_0000_0001_0000 - 1 = 0101_0000_0000_1111 
aaaa aaaa aaab cccc -> aaaa aaaa aaab cccc 

符號:強調提高可讀性。出現在字母a上方的所有數字都不變。顯示在字母b上方的數字「1」變爲「0」。並且字母c上方出現的數字「0」變爲「1」。

下一個步驟包括在做與兩個數(X)和(X-1)按位與運算的。利用上述算術性質,在每次迭代時,只有一個從該數字消失的「1」數字(從右側開始,即最低有效位)。

通過統計迭代次數,我們可以知道比特「1」有多少人在十號最初存在時,變量X等於零迭代停止。

其他人已經回答了有關格雷碼的問題。我的回答只解釋了「位計數」是如何工作的(在異或之後)。

0

這裏爲特定格雷碼單調排序幼稚測試(二進制反射格雷碼):

// 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兩個位串,這是不同的XOR1位,否則位必須賽和XOR0

 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
當連續編號的最低位,xy,爲格雷碼中的任何,是不同的,其餘必須是一樣的!這是格雷碼的定義。這意味着x^y必須看起來像0000 ... 0001。

還記得補充,~功能又名1^b?要測試最後一位x^yXOR'd與1

這解釋了x^y^1
-------------------------------------------

案例2
連續格雷碼xy中不同位的位置不是最低位。仔細看這些格雷碼連續數字。

001  010  101  lower order bits all match 
011  110  111 
    |  |   | <-- | mark location of lowest 1 
010  100  010 <-- XOR's 

有趣的是,在此格雷碼,當最低階位匹配xy,所以也沒有最低階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&-xy&-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 010100的「連續性」爲false

因此100必須立即之前或之後在枚舉000但不能立即之前或之後001010DOH !!!

買者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

相關問題