群里有人发:

public static boolean[] BiAdd(boolean[] A, boolean[] B) {
2 boolean[] mResult = null;
3 int i;
4 boolean mAcc = false;
5 if (A.length != B.length) {
6 return null;
7 }
8 mResult = new boolean[A.length + 1];
9 for (i = mResult.length - 1; i > 0; --i) { //******
10 mResult[i] = B[i - 1] ^ mAcc;
11 if (A[i - 1]) {
12 mResult[i] = !mResult[i];
13 mAcc = B[i - 1] | mAcc;
14 } else {
15 mAcc = B[i - 1] & mAcc;
16 }
17 }
18 mResult[0] = mAcc;
19 return mResult;
20 }

是一个二进制的加法运算,他想把for内部的代码简化。

我倒是想了,可惜不知道还有更好,不过让我自己写吧,我就写了下面这样一个:

function bi_add($A, $B){
//adjust the length of two binary array
($a_len = count($A)) > ($b_len = count($B)) ? ($B = array_pad($B, -$a_len, 0)) : ($A = array_pad($A, -$b_len, 0));
$C = array_fill(0, count($A) + 1, 0);
for($i = count($C) - 1; $i > 0 ; $i--){
$tmp = 2 - ($C[$i] + $A[$i - 1] + $B[$i - 1]);
if($tmp <= 0){//if has carry
$C[$i - 1] = 1;
}
$C[$i] = abs($tmp) % 2;//get 0 or 1
}
return $C;
}
$A = array(1,1);
$B = array(0,1,0,1);
echo implode("", $A)."<br />";
echo implode("", $B)."<br />";
echo implode("", bi_add($A, $B))."<br />";

倒是发到了群里,一个名叫“佳南”人开话了,说“这种没有IQ的代码就别贴出来了”,是啊,弱暴了的代码,那我虚心求教啊,求一个化简代码,结果当然无答。发现这世上高手真是多!多得只会鄙视,不会解答。我当然承认自己非主流的代码,比起什么纯逻辑操作看起来,要“没技术含量”得多,哎,也是感叹

posted on 2011-07-18 10:25  重生  阅读(335)  评论(0编辑  收藏  举报