首页 > 技术文章 > 位运算相关

r1-12king 2022-01-25 10:34 原文

六种位运算符

  • &     按位与
  • |       按位或
  • ^      按位异或
  • ~      取反
  • <<    左移
  • >>    右移

 

常见位运算操作

1、字母大小写转换

  • 统一转成大写:ch & 0b11011111 简写:ch & 0xDF
  • 统一转成小写:ch | 0b00100000 简写:ch | 0x20

比较的时候注意加上小括号哦,因为位运算优先级比较低。

 

2、判断奇偶性

  • i & 1
    • 1 为奇数
    • 0 为偶数

 

3、交换变量

  • a^=b; b^=a; a^=b;

第一步没啥好说a = a^b
第二步:b=b^a,也就是b=b^a^b,也就是b=a^0,此处换值
第三步:a=a^b 也就是a=a^b^a,也就是b

 

4、取int型变量a的第k位

  • a>>k&1

    其中,k=0,1,2……sizeof(int),这里的位数指的是二进制数位,从低到高,从右到左

1 >>> bin(22)
2 '0b10110'
3 >>> 22>>3&1
4 0
5 >>> 22>>2&1
6 1

 

5、将int型变量a的第k位清0

  • a=a&~(1<<k) 
1 >>> bin(22)
2 '0b10110'
3 >>> a = 22
4 >>> a = a&~(1<<2)
5 >>> bin(a)
6 '0b10010'

 

6、将int型变量a的第k位置1

a=a|(1<<k)

1 >>> bin(22)
2 '0b10110'
3 >>> a = 22
4 >>> a = a|(1<<3)
5 >>> bin(a)
6 '0b11110'

 

7、判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

1 def power2(x)
2     return ((x&(x-1))==0) and (x!=0);

 

8、取模运算转化成位运算 (在不产生溢出的情况下)

  • a % (2^n) 等价于 a & (2^n - 1)
    • a % 2 等价于 a & 1 ( a & log2(2))
    • a % 4 等价于 a & 2 ( a & log2(4))
    • .....
    • a % 32 等价于 a & 5


9、乘法运算转化成位运算 (在不产生溢出的情况下)

  • a * (2^n) 等价于 a<< n

 

10、除法运算转化成位运算 (在不产生溢出的情况下)

  • a / (2^n) 等价于 a>> n

例: 12/8 == 12>>3


11、

if (x == a) x= b;
   else x= a;

  • 等价于 x= a ^ b ^ x;

 

12、x 的 相反数

  • 表示为 (~x+1)

 

推荐阅读