☰
Leetcode 位运算模板
2026/10/14 15:00:12 网站建设 项目流程
基础位操作 int lowbit=x & -x; //取最低位的1 x & (x-1) //消除最低位的1 boolean has=(x>>i)&1 ==1; //第i位是否为1 x |=(1<<i); //第i位置1 x &= ~(1<<i); //第i位清0 x ^= (1<<i); //第i位翻转 int cnt=Integer.bitCount(x);//x中1的个数 int len=32-Integer.numberOfLeadingZeros(x);//x的二进制位数 x = 12 二进制: 12 = 0000 1100 求 -12 的补码: 按位取反: 1111 0011 加 1: 1111 0100 ← 这就是 -12 x & (-x): 0000 1100 (12) & 1111 0100 (-12) ----------- 0000 0100 = 4 结果: lowbit = 4,即最低位那个 1 所代表的值 异或性质 //a^a=0,a^0=a int singleNumber(int[] nums){ int x=0; for(int v:nums)x ^=v; return x; } 分组异或 int[] singleNumberIII(int[] nums){ int xor=0; for(int v:nums)xor ^=v; int lowbit=xor & -xor; int a=0,b=0; for(int v:nums){ if((v&lowbit)==0)a ^=v; else b ^=v; } return new int[]{a,b}; } 枚举子集 // 用 0..2^n-1 的每个数的二进制位表示“选不选” List<List<Integer>> subsets(int[] nums) { int n = nums.length; List<List<Integer>> res = new ArrayList<>(); for (int mask = 0; mask < (1 << n); mask++) { // 枚举所有子集 List<Integer> sub = new ArrayList<>(); for (int i = 0; i < n; i++) if ((mask >> i & 1) == 1) sub.add(nums[i]); // 第 i 位为 1 则选 res.add(sub); } return res; } 拆位 / 按位统计 // 例:统计所有数在第 i 位上 1 的个数,按位独立计算贡献 int total = 0; for (int i = 0; i < 31; i++) { // 逐位处理 int cntOne = 0; for (int v : nums) cntOne += (v >> i) & 1; // ... 用 cntOne 计算这一位对答案的贡献 } 试填 // 例:求最大异或对 / 满足条件的最大值,从高位往低位试 int ans = 0; for (int i = 30; i >= 0; i--) { // 高位优先 ans |= (1 << i); // 先假设这一位能填 1 if (!check(ans)) { // check:是否存在方案满足约束 ans ^= (1 << i); // 不行就撤销这一位 } } 异或前缀和 // pre[i] = a[0]^a[1]^...^a[i-1],区间 [l,r] 异或 = pre[r+1]^pre[l] int[] pre = new int[n + 1]; for (int i = 0; i < n; i++) pre[i + 1] = pre[i] ^ nums[i]; // 查询 [l, r] int rangeXor = pre[r + 1] ^ pre[l];

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询