所以..,結果會打印出類似這樣:如何計算一行二進制和下一行之間的開關數量?
(一號線)00100
(2號線)00110
(3號線)01100
,如果你讀它從頂部到底部:第1行與第2行然後有1個開關, ,因爲在第1行中,第4個數字(在本例中爲0)切換到第2行中的1,因爲第2行到第3行有2個開關該0分排在第二位,第4位換1分。 0到1和1到0
的事情是:必須只有一個切換從行到下一行......我怎麼檢查? 如果是這樣,那麼它可能會繼續,如果不是這樣的話,那麼它應該做別的事情。
所以..,結果會打印出類似這樣:如何計算一行二進制和下一行之間的開關數量?
(一號線)00100
(2號線)00110
(3號線)01100
,如果你讀它從頂部到底部:第1行與第2行然後有1個開關, ,因爲在第1行中,第4個數字(在本例中爲0)切換到第2行中的1,因爲第2行到第3行有2個開關該0分排在第二位,第4位換1分。 0到1和1到0
的事情是:必須只有一個切換從行到下一行......我怎麼檢查? 如果是這樣,那麼它可能會繼續,如果不是這樣的話,那麼它應該做別的事情。
如果你把兩條線連在一起,你會得到一個二進制數字,其中1
正好在那些數字不同的地方。那麼你只需要檢查一些人的數量。特別是,你想檢查只有一個,這意味着這個數字是2的冪。這是一個問題solved before。
最快的方法,如果你有他們存儲爲整數,是使用一些按位算術。
如果只有一個開關,那麼當你掩蓋一起使用XOR二進制值,結果將只有一個1
它:
00011101^01011101 == 01000000
現在,如果在結果最多一個1
有,你可以這樣檢查。假設您有一個數字p
,並且您想要檢查它的二進制表示中最多有一個1
。你可以只檢查
p & (p-1) == 0
如果p
只有一個1
集,然後p-1
將所有以前1
條目設置,但這些不會與在p
設置1
碰撞。當你按位和他們在一起時,你會以零結束。
如果你想檢查是否有正是一個1
,即要拒絕東西是零貫穿始終,那麼你還需要檢查是否p==0
和第一拒絕它。
在這裏,我已經使用了^
來按位異或,並且&
用於按位和。你需要檢查你需要什麼,取決於你使用的語言。
在PHP代碼中看起來如何? – tijntest 2014-12-08 13:01:55
我有點(哈哈)更接近現在...
它的東西,在這個代碼的附近:
<?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";
}
如何將看起來像在PHP代碼? 「解決之前」的鏈接不會導致我正在尋找... – tijntest 2014-12-08 13:00:10
你不應該把它看作是一個SUM。但是從上到下閱讀......如果你比較兩條線,那麼從上到下應該只有1個改變(對於整條線的總和,它在哪裏改變並不重要,但是隻有1個零0或0到零可能會改變) – tijntest 2014-12-08 15:14:30