所以..,结果会打印出类似这样:如何计算一行二进制和下一行之间的开关数量?
(一号线)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