JS光线投射游戏开发中C++&、>>运算符等效实现咨询
位运算符说明
&是按位与运算符,将两个操作数的二进制对应位进行与运算,只有两位都为1时结果位才为1。你给出的代码中该操作用于纹理坐标的快速取模,仅当texWidth为2的幂时生效,效率远高于普通取模运算。>>是有符号右移运算符,将操作数的二进制位整体向右移动指定位数,正数场景下等价于除以2并向下取整。你给出的代码中右移1位是为了将RGB三个通道的亮度统一减半,实现变暗效果。
JavaScript 等效代码
JavaScript 原生支持上述两个位运算符,行为和C基本一致,仅需要处理C中(int)强制类型转换的逻辑即可:
// 第一行:(int)强制转换在JS中可以用 |0 实现截断浮点数为整数的效果,和C++行为一致 const tx = (texWidth * (floorX - cellX) | 0) & (texWidth - 1); // 第二行可以直接复用,无需修改 color = (color >> 1) & 8355711;
补充说明
代码中8355711对应的十六进制为0x7F7F7F,二进制为每个RGB通道保留低7位、清零最高位,避免右移时高位溢出污染相邻通道的数值。如果你的项目需要保留颜色的alpha通道,可以改为以下写法:
// 保留原有alpha通道不变,仅变暗RGB通道 color = (color & 0xFF000000) | ((color >> 1) & 0x007F7F7F);
内容的提问来源于stack exchange,提问作者mbg206
相关产品推荐
相关产品推荐

