我有一个整数值,并希望得到位于特殊位置的位。我正在使用GLSL for OpenGL ES 2.0
像这样的东西:
GetBitOnLocation(int value, int location)
{
bit myBit = value[location];
if (myBit == 0)
return 0;
if (myBit == 1)
return 1;
}
根据之前的评论,不要这样做。
ES 2硬件本身不需要支持整数;允许将它们模拟为浮点。为此,未定义直接位测试。
如果你绝对绝望,请使用mod
和step
。例如。测试整数value
的第三位:
float bit = step(0.5, mod(float(value) / 8.0, 1.0));
// bit is now 1.0 if the lowest bit was set, 0.0 otherwise
逻辑是要将你要测试的位洗牌到0.5
位置然后用mod
切断它上面的所有位。那么只有当你想要的位被设置时,你所拥有的值才能大于或等于0.5
。
这是一个使用整数数学的解决方案(注意:不支持负整数)
// 2^x
int pow2(int x){
int res = 1;
for (int i=0;i<=31;i++){
if (i<x){
res *= 2;
}
}
return res;
}
// a % n
int imod(int a, int n){
return a - (n * (a/n));
}
// return true if the bit at index bit is set
bool bitInt(int value, int bit){
int bitShifts = pow2(bit);
int bitShiftetValue = value / bitShifts;
return imod(bitShiftetValue, 2) > 0;
}
int GetBitOnLocation(int value, int location)
{
int myBit = value & (1 << location);
if (myBit == 0)
return 0;
else
return 1;
}