2011-02-27 83 views
2

給定一個數字的灰色代碼,找到數字的二進制代碼。格雷碼是一個二進制數字系統,其中兩個連續的值僅在一個比特中有所不同。格雷碼到二進制轉換

例如兩個位格雷碼是: 0 - 00 1 - 01 2 - 11 3 - 10

二進制是:

0 - 00 1 - 01 2 - 10 3 - 11

提供算法將數字的灰色代碼轉換爲二進制代碼。

例如,輸入爲11.預期輸出是10

+0

這功課嗎?應該很容易查找。 – 2011-02-27 04:35:57

+0

作業?你試過什麼了? – 2011-02-27 04:36:32

+0

@sunmoon:如果你的答案給出了算法,你需要什麼幫助? – 2011-02-27 04:41:05

回答

2

格雷碼轉換爲二進制:

保留最顯著位,因爲它是和用於位的其餘部分不斷異或的連續的位。

即Gn Gn-1 Gn-2 ........ G1是格雷碼和Bn Bn-1 ....... B1是二進制碼。

BN = Gn和所有其他位BN-1 = GN-1 XOR GN

+0

如果這是您自己問題的答案,則將其標記爲答案:) – JohnIdol 2011-03-01 13:20:14

+0

警告 - 此答案稍微不正確。 Bn-1的正確公式是「Bn-1 = Bn XOR Gn-1」。請參閱[這裏](http://books.google.ca/books?id=MfapI7UIr9YC&lpg=PA51&ots=IKd__7XXio&dq=bn-1%20%22gray%20code%22%20gn&pg=PA50#v=onepage&q=bn-1%20 %22gray%20code%22%20gn&f = false)以獲取更多信息。 – 2011-06-16 17:26:06

0
<?php 

功能gry_code($ n)的{

if($n == 0 || $n > 65) { 

    return "Invalid input please input between 1 to 65"; 
    exit; 

} 

$arr = array(); 

array_push($arr,"0","1"); 

$i = 0; 
$j = 0; 

for ($i = 2; $i < (1<<$n); $i = $i<<1) 
{ 
    //duplicate the arr contents in reverse order 
    for ($j = $i-1 ; $j >= 0 ; $j--) 

    array_push($arr,$arr[$j]); 

    // append 0 to the first half 
    for ($j = 0 ; $j < $i ; $j++) 
     $arr[$j] = "0".$arr[$j]; 

    // append 1 to the second half 
    for ($j = $i ; $j < 2*$i ; $j++) 
     $arr[$j] = "1".$arr[$j]; 
} 
//return $arr; 
$arr = array_slice($arr, -$n); 
foreach($arr as $key => $arrx) { 

    echo $arrx."\n"; 


} 

//return $arr; 

}

print_ R(gry_code(5));

?>