位运算之&运算符和<<,>>运算符

&运算符

位运算符 & 是一种按位与运算符,用于对两个操作数的二进制位进行逻辑与操作。

它的运算规则如下:

1. 对于每一位,如果两个操作数的对应位都为 1,则结果的该位为 1;否则该位为 0。

例如,假设有两个操作数 a 和 b:

a = 5 (二进制表示为 0101)
b = 3 (二进制表示为 0011)

那么 a & b 的结果为 1,因为在对应位上,a 和 b 的二进制值都为 1。

具体运算过程如下:

   0 1 0 1 (a)
& 0 0 1 1 (b)
------------
   0 0 0 1 (结果)

因此,a & b 的结果为 1。

位运算符 & 在计算机中是通过对整数在二进制表示形式下的位进行逐位比较来实现的。该运算符常用于对位字段进行掩码处理、清除某些位或提取特定的位信息等操作。

需要注意的是,位运算符 & 不会改变操作数的值,而是生成一个新的结果。同时,位运算符 & 对于操作数的每一位都独立进行操作,并且运算结果也是一个按位独立的值。

使用&运算符可以通过n&1 ,判断一个整数 n 是否为奇数。其中 & 是按位与运算符,它会对 n 的二进制位和二进制数字 1 进行按位与运算。如果 n 为奇数,则它的二进制最后一位为 1,与数字 1 进行按位与运算的结果就是 1;如果 n 为偶数,则它的二进制最后一位为 0,与数字 1 进行按位与运算的结果就是 0。

因此,n&1 的结果是 0 或 1,如果 n&1 的结果为 1,说明 n 是奇数,反之则是偶数。这种方法比使用 % 运算符判断一个整数是否为奇数要更高效,因为按位运算比算术运算更快。

<<运算符

在计算机中,<<是左移位运算符(left shift operator),它会将一个数的二进制表示向左移动指定的位数。在左移运算过程中,原数右侧用0填充。

左移位运算的原理如下:

给定一个数 x,将其左移n位,即x<<n。

1. 将x的二进制表示向左移动n位。
2. 将右侧空缺的位用0填充。

例如,对于十进制数 12(二进制表示为 1100),执行左移操作 12 << 2:

1. 将 1100向左移动 2 位。移位后为 110000。
2. 对于移动过程中右侧的空缺位,用0填充。最终结果为 110000,对应十进制为 48。

左移位运算可以用于快速计算某个数的倍数,因为左移操作相当于将数乘以 2^n,其中 n是移动的位数。

需要注意的是,对于无符号整数类型,如无符号整型 uint,左移位运算是循环位移的。这意味着,当左移的位数超过了二进制表示的位数时,左移运算会将多余的位重新移到最低位开始的位置。

总结来说,左移位运算符 (<<) 可以将一个数的二进制表示向左移动指定的位数,右侧用0填充。它是一种快速计算倍数的方法,并且对于无符号整数类型在移动位数大于二进制表示位数时会进行循环位移。

>>运算符

通过对上面左移运算符的解释,右移运算符就变得更好理解了。

  1. 对于有符号数(如整数和长整数):右移运算符将二进制数的所有位向右移动,并根据符号位来决定新的高位填充。符号位是二进制数的最高位,表示数的正负性。如果符号位为0(表示正数),右移操作时高位用0填充;如果符号位为1(表示负数),右移操作时高位用1填充。这被称为“算术右移”。

  2. 对于无符号数(如无符号整数和无符号长整数):右移运算符将二进制数的所有位向右移动,并用0填充新的高位。无符号数没有符号位,所以右移操作时高位总是用0填充。

    int num = 10; // 二进制表示为 0000 1010
    int result = num >> 2; // 右移2位,结果为 0000 0010,对应十进制值为 2

在这个示例中,原始整数 10 的二进制表示为 0000 1010,向右移动两位后得到 0000 0010,对应的十进制值为 2

结语

在Unity游戏开发中,位运算的应用也是很广泛的,比如控制图层的显示和隐藏。可以参考下面的一篇文章。

Unity LayerMask 的位运算_unity 位运算删除layermask-CSDN博客

相信大家已经有一个较好的理解可以做一下力扣的一道题加深一下印象。

力扣

感谢大家的观看,有不对的地方尽请提出。

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值