以下是我遇到的一个例子:
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循环,但上面的内容可以扩展出来。
我想过在没有按位运算符的情况下执行按位运算,但是无法想象如何执行它。我不知道上述内容是如何在逻辑上得出的。
答案 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;
}