以下列出我收集的十分神奇而实用的位运算技巧。
1、整数
1.1 设置x的第n位为1
x | (1<<n)
1.2 设置x的第n位为0
x & ~(1<<n)
1.3 将x的第n位取反
x ^ (1<<n)
1.4 得到最大的int
int maxInt = ~(1 << 31);
int maxInt = (1 << 31) - 1;
int maxInt = (1 << -1) - 1;
1.5 得到最小的int
int minInt = 1 << 31;
int minInt = 1 << -1;
1.6 计算n乘以2
n << 1;
1.7 计算n除以2
n >> 1;
1.8 计算n乘以2的m次方
n << m;
1.9 就算n除以2的m次方
n >> m;
1.10 判断a和b是否相等
!(a^b)
1.11 判断n是否为奇数
(n & 1) == 1;
1.12 交换a和b的值
//方式1
a ^= b;
b ^= a;
a ^= b;
//方式2
a = a ^ b ^ (b = a)
1.13 得到x的绝对值
(x ^ (x >> 31)) - (x >> 31);
1.14 得到a和b中较大的数
b & ((a-b) >> 31) | a & (~(a-b) >> 31);
1.15 得到a和b中较小的数
a & ((a-b) >> 31) | b & (~(a-b) >> 31);
1.16 判断a和b是否同正负
(x ^ y) >= 0;
1.17 计算i的相反数
//方式1
i = ~i + 1;
//方式2
i = (i ^ -1) + 1;
1.18 判断n是否为2的若干次方
n > 0 && (n & (n - 1)) == 0;
1.19 拿到x的位于最右的1位
x & (-x)
1.20 拿到x的位于最右的0位
~x & (x+1)
1.21 将x的位于最右的0位设置为1
x | (x+1)
1.22 计算n + 1
-~n
1.23 计算n - 1
~-n
二、字符
2.1 将x转换为小写(如果原来就已经为小写则保持)
x | ' '
2.2 将x转换为大写(如果原来就已经为大写则保持)
x & '_'
2.3 大小写互换
x ^ ' '
2.4 得到x在字母表中的位置(大小写都适用)
x & '\x1F'