n & (n - 1) 去掉最低位的1(191、231) a ^ a = 0(136) (a * b) % k = (a % k)(b % k) % k(372)
参考文章
公众号:数据结构与算法
CSDN博客
CSDN博客
常见运算符
&&: A && B,A为真,不执行B (剑指64) ||: A || B, A为假,不执行B &:按位与。 |:按位或。 ~:按位非。 ~x = -x-1 ^:按位异或。(相同为0,否则为1) <<:左位移运算符。 >>:右位移运算符。 >>>:无符号右移运算符。 与、或、异或运算符优先级比==低
常见操作
一个数的基本操作
判断奇偶:
(x&1)==0
//0为偶
判断正负数:
a>>31
//0为正
(i >> 31) | (-i >>> 31)
返回x的符号:正数为1,负数为-1
取相反数
~(x-1)
~x+1
(n ^ -1) + 1;
取绝对值
(n ^ (n >> 31)) - (n >> 31)
(x >> 31) == 0 ? x : (~x + 1)
(x + (x >> 31)) ^ (x >> 31)
+/-
n+1 -~n
n-1 ~-n
两个数的基本操作
交换两个值
void swap(int a, int b){
a ^= b;
b ^= a;
a ^= b;
}
取两个数的最大值
(x & ((y - x) >> 31)) | (y & (~(y - x) >> 31))
求两数的平均数
(x + y) >> 1
(x & y) + ((x ^ y) >> 1)
判断x和y的符号是否相同
(x ^ y) >= 0
两数相加
(x | y) + (x & y)
(x ^ y) + ((x & y) << 1)
两数相减
(x & ~y) - (~x & y)
选择
if(x == a) x = b; if(x == b) x = a:
用异或运算符:x = a ^ b ^ x。
一个数的高级操作
从低位到高位,取x后m位的值
x&((1<<m)-1)
从低位到高位,取x的第m位
(x >> (m-1)) & 1
把x从右边数第n位变1:
x|(1<<(n-1))(n从1开始)
把x从右边数第n位变0
x&(~(1<<(n-1)))(n从1开始)
取x前n位的值,后面的全部置为0
x & (~((1 << (32 - n)) - 1))
只保留x右边第一个1,其他的全部置为0
x & (-x)
x & ~(x - 1)
判断x的第n位是偶数还是奇数
(x & (1 << (n - 1))) == 0
消去x最后一位的1
x&(x-1)
判断一个数是不是2的次幂
(x != 0) && (x & (x - 1)) == 0
x对2的n次方求余
x & (2^n - 1)(这里的^是幂的次方)
异或
x^x=0; 相同数值进行异或结果为0 xy=y x ∀i∈Z,有4i⊕(4i+1)⊕(4i+2)⊕(4i+3)=0
x, x=4k,k∈Z
1, x=4k+1,k∈Z
sumXor(x)=
x+1, x=4k+2,k∈Z
0, x=4k+3,k∈Z
题目