位运算与使用场景

2018/07/14 303

二进制

运算符

程序中的所有数在计算机内存中都是以二进制的形式存储的。位运算说穿了,就是直接对整数在内存中的二进制进行操作。

按位与

& 对应的两个二进制位均为1时,结果才是1,否则是0

9 & 5 = 1
00001001
00000101
00000001

&运算通常用于二进制的取位操作,例如一个数n & 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数是奇数。

按位或

| 对应位任意一个为1时,结果为1,否则是0

9 | 5 = 13
00001001
00000101
00001101

or运算通常用于二进制特定位上无条件赋值,例如一个数n | 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,可使用(n | 1) - 1,实际意义就是把这个数强行变成最接近的偶数。

按位异或

^ 对应的两个二进制位相异时,结果为1,否则是0

9 ^ 5 = 12
00001001
00000101
00001100

按位取反

~ 对参与运算的数的各二进制位求反

~ 9
00001001
11110110

左移

<< 把左边的运算位数的各二进制位全部左移若干位,由**<<**右边的数指定移动位数,高位丢弃,低位补0

9 << 4 = 144
00001001
10010000

右移

>> 把左边的运算位数的各二进制位全部右移若干位,由**>>**右边的数指定移动位数

9 >> 2 = 2
00001001
00000010

运用

权限处理

权限
查询 1 = 2 ^ 0
添加 2 = 2 ^ 1
修改 4 = 2 ^ 2
删除 8 = 2 ^ 3
001
010
100
111 = 7

若想给用户设置查询、添加、修改权限

user.Permisson = 1 | 2 | 4;
// user.Permisson = 7;

若用户权限为7 = 1 | 2 | 4,判断用户是否拥有删除权限

if ((8 & 7) == 8)
    // 拥有权限
else
    // 无权限

添加删除权限

user.Permission = 7 | 8;
// SaveChanges();

取消修改权限

user.Permission = ~4 & 7;
// SaveChanges();
评论