今日分享 位运算
位运算直接操作二进制位,是程序员的底层魔法。它不仅效率极高,还能写出优雅巧妙的代码。
核心运算与奥义
与 ( & ): 全1才1。常用于屏蔽某些位或检查特定位是否为1。
或 ( | ): 有1就1。常用于设置某些位为1。
异或 ( ^ ): 不同为1。可理解为"无进位加法",是交换、加密的神器。
左移 ( << ): 乘以2的幂。右边补0,注意溢出。
右移 ( >> ): 除以2的幂。符号位决定左边补0还是1。
常用技巧
1. 判断奇偶: x & 1 ,结果为1则奇数,0则偶数。
2. 交换两数: a ^= b; b ^= a; a ^= b; ,无需临时变量。
3. 清除最后一个1: x & (x - 1) ,用于统计二进制中1的个数。
4. 获取最后一个1: x & -x ,在树状数组等数据结构中很有用。
实战例题:缺失的数字
题目: 给定包含 0, 1, 2, ..., n 中 n 个数的序列,找出缺失的那个数。
思路: 利用异或的特性: x ^ x = 0 和 x ^ 0 = x 。将数组中所有数与 0 到 n 异或,最终结果就是缺失的数字。
C语言实现
#include <stdio.h>
int missingNumber(int* nums, int numsSize) {
int result = numsSize;
for (int i = 0; i < numsSize; i++) {
result ^= i ^ nums[i];
}
return result;
}
int main() {
int nums[] = {3, 0, 1};
printf("Missing number: %d\n", missingNumber(nums, 3)); // 输出 2
return 0;
}
C++实现
#include <iostream>
#include <vector>
using namespace std;
int missingNumber(vector<int>& nums) {
int result = nums.size();
for (int i = 0; i < nums.size(); i++) {
result ^= i ^ nums[i];
}
return result;
}
int main() {
vector<int> nums = {3, 0, 1};
cout << "Missing number: " << missingNumber(nums) << endl; // 输出 2
return 0;
}
Python实现
def missingNumber(nums):
result = len(nums)
for i, num in enumerate(nums):
result ^= i ^ num
return result
nums = [3, 0, 1]
print("Missing number:", missingNumber(nums)) # 输出 2
Java实现
public class MissingNumber {
public static int missingNumber(int[] nums) {
int result = nums.length;
for (int i = 0; i < nums.length; i++) {
result ^= i ^ nums[i];
}
return result;
}
public static void main(String[] args) {
int[] nums = {3, 0, 1};
System.out.println("Missing number: " + missingNumber(nums)); // 输出 2
}
}