2014-12-08 34 views
1

所以..,結果會打印出類似這樣:如何計算一行二進制和下一行之間的開關數量?

(一號線)00100

(2號線)00110

(3號線)01100

,如果你讀它從頂部到底部:第1行與第2行然後有1個開關, ,因爲在第1行中,第4個數字(在本例中爲0)切換到第2行中的1,因爲第2行到第3行有2個開關該0分排在第二位,第4位換1分。 0到1和1到0

的事情是:必須只有一個切換從行到下一行......我怎麼檢查? 如果是這樣,那麼它可能會繼續,如果不是這樣的話,那麼它應該做別的事情。

回答

0

如果你把兩條線連在一起,你會得到一個二進制數字,其中1正好在那些數字不同的地方。那麼你只需要檢查一些人的數量。特別是,你想檢查只有一個,這意味着這個數字是2的冪。這是一個問題solved before

+0

如何將看起來像在PHP代碼? 「解決之前」的鏈接不會導致我正在尋找... – tijntest 2014-12-08 13:00:10

+0

你不應該把它看作是一個SUM。但是從上到下閱讀......如果你比較兩條線,那麼從上到下應該只有1個改變(對於整條線的總和,它在哪裏改變並不重要,但是隻有1個零0或0到零可能會改變) – tijntest 2014-12-08 15:14:30

1

最快的方法,如果你有他們存儲爲整數,是使用一些按位算術。

如果只有一個開關,那麼當你掩蓋一起使用XOR二進制值,結果將只有一個1它:

00011101^01011101 == 01000000 

現在,如果在結果最多一個1有,你可以這樣檢查。假設您有一個數字p,並且您想要檢查它的二進制表示中最多有一個1。你可以只檢查

p & (p-1) == 0 

如果p只有一個1集,然後p-1將所有以前1條目設置,但這些不會與在p設置1碰撞。當你按位和他們在一起時,你會以零結束。

如果你想檢查是否有正是一個1,即要拒絕東西是零貫穿始終,那麼你還需要檢查是否p==0和第一拒絕它。

在這裏,我已經使用了^來按位異或,並且&用於按位和。你需要檢查你需要什麼,取決於你使用的語言。

+0

在PHP代碼中看起來如何? – tijntest 2014-12-08 13:01:55

1

我有點(哈哈)更接近現在...

它的東西,在這個代碼的附近:

<?php 



function _xor($text,$key){ 
    for($i=0; $i<strlen($text); $i++){ 
     $text[$i] = intval($text[$i])^intval($key[$i]); 
    } 
    return $text; 
} 

echo _xor('01100001','01100010'); 
$new = _xor('01100001','01100010'); 


$new = str_split($new); 
echo array_sum($new); 


if ($new > 1) { 
echo " a is bigger than 1 b, begin opnieuw"; } elseif ($new == $new) { 
echo "a is equal to b "; 
} else { 
echo "a is smaller than b"; 
} 
相關問題