常用技巧 —— 位运算 —— 位运算基础
【与运算】
与运算常用于二进制的取位操作,其用符号 & 表示,相同位的两个数字都为1,则为1,若有一个不为1,则为0。
例如:00101 & 11100 = 00100
其会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值。
例如:3(11) & 2(10) = 2(10)
典型应用:任意一个数 &1 的结果就是取二进制的最末位,常用于判断数的奇偶,最末位为 0 表示该数为偶数,最末位为 1 表示该数为奇数。
【或运算】
或运算常用于二进制特定位上的无条件赋值,其用符号 | 表示,相同位的两个数字只要一个为 1 即为 1。
例如:00101 | 11100 = 11101
其会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值。
例如:3(11)|2(10)=3(11)。
典型应用:一个数 | 1 的结果就是把二进制最末位强行变成 1,如果需要把二进制最末位变成 0,对这个数 | 1 后再减一即可,其实际意义就是把这个数强行变成最接近的偶数。
【非运算】
非运算是把内存中的 0 和 1 全部取反,用符号 ~ 表示。
使用非运算时要格外小心,需要注意整数类型有没有符号,如果非运算的对象是无符号整数,那么得到的值就是它与该类型上界的差,因为无符号类型的数是用 00 到 $FFFF 依次表示的。
【异或运算】
异或运算,是对等长二进制模式按位执行逻辑按位异或操作,用符号 ^ 表示,如果某位不同则该位为 1,否则该位为 0。
例如:00101 ^ 11100 = 11001
其会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值。
例如:3(11) ^ 2(10) = 1(01)
异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即:(a ^ b) ^ b = a
【左移与右移】
1.左移运算
左移运算,用符号 << 表示,操作 a << b 就是把 a 转为二进制后左移 b 位(在后面填充 b 个 0),实质上就是 a 乘以 2 的 b 次方,因为在二进制数后添一个 0 就相当于该数乘以 2。
例如:100(1100100) << 2 = 400(110010000)
通常认为,a << 1 比 a*2 要更快,因为前者是更底层的操作,因此程序中乘以 2 的多少次方的操作尽量用左移位来代替。
2.右移运算
右移运算,用符号 << 表示,操作 a >> b 就是把 a 转为二进制后右移 b 位(去掉末尾 b 个 0),实质上就是 a 除以 2 的 b 次方(取整)。
例如:400(110010000) >> 2 = 100(1100100)
通常认为,a >> 1 比 a/2 要更快,因为前者是更底层的操作,因此程序中除以 2 的多少次方的操作尽量用右移位来代替。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)