美文网首页
C#位运算讲解与示例2

C#位运算讲解与示例2

作者: 某人在 | 来源:发表于2018-01-17 17:13 被阅读42次

在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。

运算符号意义运算对象类型运算结果类型对象数实例

~位逻辑运算整型,字符型整型1~a

&位逻辑运算2a & b

|位逻辑运算2a | b

^位逻辑异或运算2a ^ b

<< 位左移运算2a<<4

>> 位右移运算2a>>2

1、位逻辑非运算

位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。

比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是:

~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。

2、位逻辑与运算

位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。

比如:10010001(二进制)&11110000等于10010000(二进制)。

3、位逻辑或运算

位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,

0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。

4、位逻辑异或运算

位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,

1异或0等于1,0异或0等于0。即:相同得0,相异得1。

比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。

5、位左移运算

位左移运算将整个数按位左移若干位,左移后空出的部分0。比如:8位的byte型变量

byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。

将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。

左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。

x<<1= x*2 

x<<2= x*4 

x<<3= x*8 

x<<4= x*16

6、位右移运算

 位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量

Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。

将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。

  右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。

x>>1= x/2 

x>>2= x/4 

x>>3= x/8 

x>>4=x/16

在进行位与、或、异或运算时,如果两个运算对象的类型一致,则运算结果的类型就是运算对象的类型。比如对两个int变量a和b做与运算,运算结果的类型还是int型。如果两个运算

对象的类型不一致,则C#要对不一致的类型进行类型转换,变成一致的类型,然后进行运算。

类型转换的规则同算术运算中整型量的转换则一致。

由位运算符连接整型量而成的表达式就是位运算表达式。

-

常用的位运算主要有与(&), 或(|)和非(~), 比如:

1 & 0 = 0, 1 | 0 = 1, ~1 = 0

在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理.

第一步, 先建立一个枚举表示所有的权限管理操作:

[Flags]

publicenumPermissions{

Insert =1,

Delete =2,

Update =4,

Query =8

}

[Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的n次方来赋值, 这样表示成二进制时刚好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一种权限, 1表示有该权限, 0表示没有.

接下来是权限的运算:

1. 权限的加法, 使用与运算来实现. 我们知道, 0001 | 0100 = 0101, 这样就表示同时具有第一位和第三位的权限管理了, 枚举表示为:

Permissions per = Permissions.Insert | Permissions.Update 

2. 权限的减法, 使用与运算+非运算来实现, 如上面要去掉Insert权限, 操作为:

Permissions per &= ~Permissions.Insert即是 0101 & ~0001 = 0101 & 1110 = 0100 

3. 权限的判断, 使用与运算, 当判断用一用户是否具有该操作权限时, 要把用户的的权限与操作权限进行与运算, 如果得到的结果仍是操作权限管理, 则表示用户具有该权限:

Permissions per = Permissions.Insert |

Permissions.Update;

if(per & PermissionsPermissions.Insert = Permissions.Insert)

{

//有操作权限    }

比较过程为 0101 & 0001 = 0001, 0001的0位用与C#位运算把其它位都置成0, 变成只比较1的这一位.

相关文章

  • C#位运算讲解与示例2

    在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个...

  • Unity3dC#位运算讲解与示例

    C#位运算讲解与示例首先每一个权限数都是2的N次方数如:k1=2 ; //添加k2=4 ; //删除k3=8; /...

  • C#位运算讲解与示例1

    今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • C语言08- 位运算,宏定义,递归

    16:位运算 16.1:位运算概述 二进制与位运算 16.2:与(and):& 与运算:只有当2个数对应的位都为1...

  • 2018-12-27幸运抽奖

    幸运抽奖 一、 总结 (1) . C#中运算符有算术运算符、关系运算符和逻辑运算符等 (2) . C#中的类型转换...

  • swift-位运算符

    1. 位取反运算符( ~ ) 位取反运算符(~ )是对所有位的数字进行取反操作 2. 位与运算符( &) 位与运算...

  • Python运算符重载

    Python运算符重载 一、模拟数字类型运算重载 1.算术运算 2.比较运算 示例: 二、反向操作与就地操作 1....

  • 【第十章】综合训练-幸运抽奖

    一、 总结 (1) . C#中运算符有算术运算符、关系运算符和逻辑运算符等(2) . C#中的类型转换分自动类型转...

  • C#基础之006 常用运算符 2

    在上一节C#基础之005 常用运算符 1中我们讲解了运算符中的赋值运算、算术运算以及复合算术运算,那么这一节我们继...

网友评论

      本文标题:C#位运算讲解与示例2

      本文链接:https://www.haomeiwen.com/subject/iepuoxtx.html