没有按位运算符的按位运算

时间:2009-09-19 19:07:29

标签: flex flash algorithm

以下是我遇到的一个例子:

private function bitwiseAnd(a:int, b:int):int {
    var result:int = 0;
    var n:int = 1;
    while ((a > 0) && (b > 0)) {
        if (((a % 2) == 1) && ((b % 2) == 1)) {
            result += n;    
        }
        a = a / 2;
        b = b / 2;
        n = n * 2;
    }
    return result;
}

所以基本上我所需要的只是bitwiseOr和bitwiseNot而且我已经设置了。
原因是Pixel Bender不支持按位操作(莫名其妙)但支持各种数学运算。他们也不支持Flash循环,但上面的内容可以扩展出来。

我想过在没有按位运算符的情况下执行按位运算,但是无法想象如何执行它。我不知道上述内容是如何在逻辑上得出的。

1 个答案:

答案 0 :(得分:5)

似乎是一项基本练习 - 特别是'或'(将'&&'更改为'||'的两次出现):

private function bitwiseOr(a:int, b:int):int {
    var result:int = 0;
    var n:int = 1;
    while ((a > 0) || (b > 0)) {
        if (((a % 2) == 1) || ((b % 2) == 1)) {
            result += n;    
        }
        a = a / 2;
        b = b / 2;
        n = n * 2;
    }
    return result;
}

还有一些与Not有关的工作 - 因为你不能提前停止循环,你需要知道要处理多少位。最后一个问题是如何处理符号位;这也需要翻转。理想情况下,我们使用无符号整数 - 我不确定它们是否是一个选项。这段代码避免了这个问题:它翻转31位,留下第32位作为读者的练习。

private function bitwiseNot(a:int):int {
    var result:int = 0;
    var n:int = 1;
    var i:int = 0;
    while (i < 31)  {
        if ((a % 2) == 0) {
            result += n;    
        }
        a = a / 2;
        n = n * 2;
        i++;
    }
    return result;
}