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层

其他使用方法

### Unity使用位运算与枚举的方法 #### 一、定义带有 Flags 属性的枚举 为了使枚举能够作为位标志来使用,在定义枚举时需加上 `Flags` 特性。这表明该枚举成员可以组合起来形成复合状态。 ```csharp [Flags] public enum Permissions { None = 0, Read = 1 << 0, // 或者写作 1 Write = 1 << 1, // 或者写作 2 Execute = 1 << 2, // 或者写作 4 All = Read | Write | Execute } ``` 上述代码展示了权限管理中的典型场景,其中每个权限被赋予不同的二进制位[^1]。 #### 二、设置和清除标志 通过按位逻辑运算符可轻松实现对单个或多个标志的操作: - **添加/启用某个标志** 当希望给对象增加某项功能(即开启相应标志),可以通过 OR 运算完成此操作。 ```csharp Permissions currentPermission = Permissions.Read; currentPermission |= Permissions.Write; // 添加写入权限 ``` - **移除/禁用某个标志** 如果要取消已有的能力,则采用 AND NOT ( & ~ ) 来达到目的。 ```csharp currentPermission &= ~Permissions.Execute; // 移除执行权限 ``` - **判断是否存在特定标志** 利用 AND (&) 可检测目标是否具备指定属性。 ```csharp bool hasReadAccess = (currentPermission & Permissions.Read) != 0; ``` 以上三种基本操作涵盖了大多数情况下对于位标志的需求。 #### 三、显示位标志枚举 值得注意的是,默认情况下 Unity 编辑器不会以直观的方式展示带 Flag 的枚举值;这意味着开发者可能需要自定义 Inspector 组件以便更好地可视化这些数据结构[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值