算法-2 位运算

  1. n & (n - 1) 去掉最低位的1(191、231)
  2. a ^ a = 0(136)
  3. (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)
  • <<:左位移运算符。
  • >>:右位移运算符。
  • >>>:无符号右移运算符。
  • 与、或、异或运算符优先级比==低

常见操作

一个数的基本操作

  1. 判断奇偶:
(x&1)==0 
//0为偶
  1. 判断正负数:
a>>31
//0为正

(i >> 31) | (-i >>> 31)
返回x的符号:正数为1,负数为-1
  1. 取相反数
~(x-1)
~x+1
(n ^ -1) + 1; 
  1. 取绝对值
(n ^ (n >> 31)) - (n >> 31)
(x >> 31) == 0 ? x : (~x + 1)
(x + (x >> 31)) ^ (x >> 31)
  1. +/-
n+1 -~n 
n-1 ~-n

两个数的基本操作

  1. 交换两个值
void swap(int a, int b){
    a ^= b;
    b ^= a;
    a ^= b;
}
  1. 取两个数的最大值
(x & ((y - x) >> 31)) | (y & (~(y - x) >> 31))
  1. 求两数的平均数
(x + y) >> 1
(x & y) + ((x ^ y) >> 1)
  1. 判断x和y的符号是否相同
(x ^ y) >= 0
  1. 两数相加
(x | y) + (x & y)
(x ^ y) + ((x & y) << 1)
  1. 两数相减
(x & ~y) - (~x & y)
  1. 选择
if(x == a) x = b; if(x == b) x = a:
用异或运算符:x = a ^ b ^ x。

一个数的高级操作

  1. 从低位到高位,取x后m位的值
x&((1<<m)-1)
  1. 从低位到高位,取x的第m位
(x >> (m-1)) & 1
  1. 把x从右边数第n位变1:
x|(1<<(n-1))(n从1开始)
  1. 把x从右边数第n位变0
x&(~(1<<(n-1)))(n从1开始)
  1. 取x前n位的值,后面的全部置为0
x & (~((1 << (32 - n)) - 1))
  1. 只保留x右边第一个1,其他的全部置为0
x & (-x)
x & ~(x - 1)
  1. 判断x的第n位是偶数还是奇数
(x & (1 << (n - 1))) == 0
  1. 消去x最后一位的1
x&(x-1)
  1. 判断一个数是不是2的次幂
(x != 0) && (x & (x - 1)) == 0
  1. x对2的n次方求余
x & (2^n - 1)(这里的^是幂的次方)

异或

  1. x^x=0; 相同数值进行异或结果为0
  2. xy=yx
  3. ∀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

题目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prince_H_23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值