2014-12-08 33 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"; 
} 
相关问题