位运算
Posted gznb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。
0x3F 3F 3F 3F 有两个特性
1、整数的两倍不超过 0x7F FF FF FF,即 int 能表示的最大正整数.
2、整数的每 8 位(每个字节)都是相同的。
需要考虑溢出的问题,以防止超过整数所能表示的最大范围,在表达式中,是按照最高的数据类型来保持中间变量的,与最后保存的变量数据类型无关。
一、 计算 (a ^ b) mod p (快速幂)
1 int power (int a, int b, int p) 2 int ans = 1 % p; 3 while (b) 4 if (b & 1) ans = (ans * a) % p; 5 a = (a * a) % p; 6 b >>= 1; 7 8 return ans; 9
二、计算 (a * b) mod p
方法一:b 用二进制表示.和快速幂的类似。
1 int mul_1 (int a, int b, int p) 2 int ans = 0; 3 while (b) 4 if (b & 1) ans = (ans + a) % p; 5 a = (a * 2) % p; 6 b >>= 1; 7 8 return ans; 9
方法二: (a * b) mod p = (a * b) - (a * b / p) * p
1 int mul_2 (int a, int b, int p) 2 a = a % p; 3 b = b % p; 4 int c = a * b / p; 5 int ans = a * b - c * p; 6 if (ans < 0) ans += p; 7 else if (ans >= p) ans -= p; 8 return ans; 9
二进制状态压缩
是将一个长度为 m 的 bool 数组用一个 m 位的二进制整数表示并存储。例如 STL 中的 bitset.
1、取出整数 n 在二进制表示下的第 k 位 (n >> k) & 1
2、取出整数 n 在二进制表示下的第 0 ~ k-1 位 (n) & ((1 << k ) - 1)
3、把整数 n 在二进制的表示下的第 k 位取反 n xor (1 << k)
4、把整数 n 在二进制表示下的第 k 位赋值 1 n | (1 << k)
5、把整数 n 在二进制表示下的第 k 位赋值 0 n & (~(1 << k))
if (n % 2 == 0) n xor 1 = n + 1
else n xor 1 = n - 1
lowbit()运算
lowbit(n) 取出非负整数 n 在二进制表示下最低位的 1 以及它后边的 0 构成的数值
lowbit(n) = n & (~n + 1) = n & (-n)
以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字