Unity 位运算介绍及使用

介绍

位运算是指对二进制数的位(bit)进行操作的运算符,可以实现一些高效的逻辑和数学运算。Unity中常用的位运算符有以下几种:

与(&):只有两个位都是1,结果才是1;
或(|):只要两个位有一个是1,结果就是1;
非(~):如果位为0,结果是1,如果位为1,结果是0;
异或(^):两个操作数的位中,相同则结果为0,不同则结果为1;
左移(<<):左移表示乘以2,左移多少位表示乘以2的几次幂;
右移(>>):右移表示除以2,右移多少位表示除以2的几次幂;
无符号右移(>>>):无论左侧操作数的类型如何,高顺序空位位置始终设置为零。

测试

二进制:
1010 & 0010 = 0010
1010 | 0010 = 1010
~1010 = 1111111111110101
1010 ^ 0010 = 1000
1010 << 2 = 00101000
1010 >> 2 = 0010

十进制:
10 & 2 = 2
10 | 2 = 10
~10 = -11
10 ^ 2 = 8
10 << 2 = 40
10 >> 2 = 2

使用

位运算的例子有很多,列举一些常见的:

1.判断一个数是否是偶数:可以用 a & 1 == 0 来判断,如果为真,说明 a 的最低位是 0,即 a 是偶数;如果为假,说明 a 的最低位是 1,即 a 是奇数。
2.交换两个数的值:可以用异或运算来实现,例如 a = a ^ b; b = a ^ b; a = a ^ b; 就可以使 a 和 b 的值互换,不需要额外的变量。
3.翻转一个数的某些位:可以用异或运算和掩码来实现,例如 a = a ^ mask; 就可以使 a 和 mask 相同位置的位取反,mask 中为 1 的位表示要翻转的位,为 0 的位表示保持不变。
4.设置一个数的某些位为 1:可以用或运算和掩码来实现,例如 a = a | mask; 就可以使 a 和 mask 相同位置的位为 1,mask 中为 1 的位表示要设置为 1 的位,为 0 的位表示保持不变。
5.清除一个数的某些位为 0:可以用与运算和掩码来实现,例如 a = a & mask; 就可以使 a 和 mask 相同位置的位为 0,mask 中为 0 的位表示要清除为 0 的位,为 1 的位表示保持不变。

Unity中使用

Unity中使用位运算的一个常见场景是处理Layer层。Layer层是用int32来表示的,每一位代表一个层。例如,第0位代表Default层,第8位代表Water层。如果想要设置一个物体或相机只显示或忽略某些层,就可以用位运算符来实现。例如:

LayerMask mask = 1 << 8; //开启Water层
LayerMask mask = 1 << 0 | 1 << 8; //开启Default层和Water层
LayerMask mask = ~ (1 << 8); //关闭Water层
LayerMask mask = ~ (1 << 0 | 1 << 8); //关闭Default层和Water层
camera.cullingMask |= 1 << LayerMask.NameToLayer (“Npc”); //打开Npc层
camera.cullingMask &= ~ (1 << LayerMask.NameToLayer (“Npc”)); //关闭Npc层
camera.cullingMask ^= 1 << LayerMask.NameToLayer (“Npc”); //开关Npc层

猜你喜欢

转载自blog.csdn.net/qq_39162826/article/details/130237960