C#位运算符的实际应用

blsz114 2012-09-16 08:46:44
求C#位运算符的实际用或是规律,主要是下面这几个

~ 按位求补符;
^ 异或位运算符;
& 且位运算符;
| 或位运算符;
<<左移运算符
>>右移运算符

我知道& 且位运算符的一个应用,就是在权限管理系统中的一个应用

权限系统中,Role为角色,Module为模块,Permission为权限
设各权限值分别如下(2倍等比递增的关系):
1. 列表/查看 = 2
2. 新增 = 4
2. 修改 = 8
4. 删除 = 16
此时的“Role : Module : Permission”中的Permission等于上述四种操作权限中所拥有的权限值之和,比如:若某个(Role + Module)拥有查看、新增、修改、删除的权限,则其Permission=2+4+8+16=30。
下面进行权限检测,判断“(Role + Module)”所对应的Permission是否包含上述四种操作权限中的每一个。解决问题关键:使用“&”运算符。比如:
判断Permission是否包含“查看”的权限值,就用 if((Permission & 2) == 2)
判断Permission是否包含“新增”的权限值,就用 if((Permission & 4) == 4)
判断Permission是否包含“修改”的权限值,就用 if((Permission & 8) == 8)
判断Permission是否包含“删除”的权限值,就用 if((Permission & 16) == 16)

求其它位运算符的实际应用,就是在什么情况下使用,并不是位运算的原理,而是实际的应用,或在应用中的规律,求高手

...全文
548 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyo_zhulin 2012-12-26
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
比如说位运算可以用来比对DNA,可以用来表示颜色,可以用来表示神经网络、可以.......

其实一切信息都可以用“0、1”二进制表示。但是编程设计的关键是知道应用领域本身的逻辑结构,然后我们可以说“我可以把枚举的权限值用bit来表示、我可以把DNA用bit来表示、我可以把神经网络用bit表示”。

实际上你应该尽量使用自然的方式来先学会分析业务逻辑。如果一上来就纠结在bit里,你就没有更大的机会去真正全面、深入地讨论业务逻辑了。

建议lz,趁着你现在还有热情和动力去讨论“bit运算的应用”,暂时忘掉你的bit运算,去多做一些更大技术范围里的业务分析和设计训练。你可以讨论更多算法设计问题,而对过于细节、每个设计人员都有权利对底层结构稍作修改其实可以先放一放。
cheng2005 2012-09-16
  • 打赏
  • 举报
回复
菜刀的100种使用场景
楼主肯定喜欢这种文章.
threenewbee 2012-09-16
  • 打赏
  • 举报
回复
应用很多啊,比如说xor具有如下特性,a xor b = c, c xor b = a,根据这个特性,可以简单地加密解密,假设a是原文,b是密码,加密产生c,解密时根据b和c就能得到a。

代替加减乘除运算,事实上>>和<<可以代替整除2和乘以2的操作,并且速度很快。而+运算可以用and和xor实现。在计算机内部,加法减法其实就是用位运算实现的。

位掩码运算,就是你说的“权限判断”,这是一个特例,它的本质就是让多个bool变量共享一个整数变量,一个整数变量可以共享32个bool,因为有32个位。注意,我们可以延伸下,用一个32bit变量共享出2个16bit短整数,或者4个字节,等等,节省内存空间,并且提高计算速度(往往计算机一次性读取字长单位的数据是最有效率的)。

对上面的再扩展,有时候我们需要用多个变量拼接成一个变量,比如x86电脑是32bit的。我们要做对两个128bit精度的数字的四则运算,我们就要用到位运算——事实上也可以理解为,计算机内部加减乘除原理就是位运算,但是只能处理固定长度的数据类型,如果要超出这个长度,我们就要自己用四则运算规律制作“软CPU”。

变量转换,比如将int转换为short,将int转换为unicode char,将byte[4]转化为double(当然大部分实现已经系统完成了,但是原理你要清楚)。

图形算法,在图形算法中,位运算用得最多,比如说一个32bit整数,非常适合表示一个像素(argb各占一个字节)。我们要将这个颜色加深,取灰度等等,都要用到位运算。

其余还有:数据编码、压缩、索引、搜索遍历、逻辑判断、复杂算法优化(比如做bitmap、index等等)……可以说,位运算是计算机运行的基本原理,并且当你需要处理计算机和你使用的函数库不能直接办到的事情的时候,就必须和这些概念打交道了。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
权限设置为什么要使用位运算?
[/Quote]

因为楼主希望能够沉醉其中、消磨学习的时光。
OObigO 2012-09-16
  • 打赏
  • 举报
回复

权限设置为什么要使用位运算?

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧