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)

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

...全文
525 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
  • 打赏
  • 举报
回复

权限设置为什么要使用位运算?
中文名: Visual C# 2008从入门到精通 作者: 崔群法 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社书号: 9787121083662发行时间: 2009年04月01日 地区: 大陆 语言: 简体中文 简介: 编辑推荐 本书可作为Visual C#2008初学者的入门教程,更适用于具有一定C#编程基础的读者。通过本书的学习,读者可以迅速提高基于Visual C#2008开发Windows应用程序的实际开发技能。    本书的特点包括:本书内容安排详略得当、章节条理清楚、层次分明、讲解详细严谨。   本书注重理论与实践结合,对于每种技术要点都结合实例详细介绍,使读者能够轻松掌握。   本书紧紧围绕Visual C#2008开发展开讲解,具有很强的逻辑性和系统性。   内容新颖,涵盖了大部分Visual C#2008的新特性。   技术全面、实例丰富、效果实有。   书中各实例均经过精心设计,操作步骤清晰简明,技术分析深入浅出,实例效果精美实用。 内容简介 .NET已经成为Microsoft的支撑战略技术,Microsoft的很多产品现在都围绕.NET而展开。而C#是.NET的核心——.NET框架的“母语”,因此使用C#能够有效地开发基于.NET的应用程序。   本书以最新的.NET 3.5和Visual C# 2008为基础循序渐进地介绍了从入门到深入掌握Visual C# 2008所需的各个方面,包括开发环境的配置、C#语法、Windows应用程序开发、处理文件和注册表,创建基于Web的应用程序以及.NET 3.5的新增特性等。   本书同时还介绍了大量Visual C# 2008的开发经验,对使用中的重点、难点进行了专门的讲解,是一本有效、实用的从入门到精通级的学习指南。   本书适合于学习Visual C# 2008技术的初、中级读者使用,如果是初学者,本书将带你顺利进入Visual C# 2008开发领域,如果已有Visual C# 2008技术基础,本书将是你提高开发技能和更新开发理念的必备工具。 目录: 第一篇 入门必备、 第1章 .NET Framework和C#简介 1.1 .NET Framework与C# 1.1.1 C#概述 1.1.2 .NET Frameworlk 3.5概述 1.1.3 公共语言运行时(CLR) 1.1.4 .NET Framework类库 1.1.5 程序集 1.1.6 命名空间 1.2 部署.NET Framework环境 1.2.1 Visual Studio 2008简介 1.2.2 安装ViSUal Smdio 2008 1.2.3 了解Visual Studio 2008工作环境 1.3 创建第一个C#程序 1.4 C#命令行编译器 1.4.1 命令行生成 1.4.2 设置环境变量和帮助 1.4.3 C#编译器选项 1.4.4 编译C#类库 第2章 C#基础语法 2.1 C#语法 2.1.1 变量 2.1.2 常量 2.1.3 注释 2.1.4 C#预处理器指令 2.2 控制语句 2.2.1 选择语句 2.2.2 循环语句 2.2.3 跳转语句 2.3 预定义数据类型 2.3.1 值类型和引用类型 2.3.2 CTS类型 2.4 控制台程序 2.4.1 Main()方法 2.4.2 WriteLine()方法 2.5 C#3.5语言功能 2.5.1 隐含类型化的局部变量 2.5.2 扩展方法 2.5.3 对象与集合初始化器 2.5.4 匿名类型 2.5.5 Lanlbda表达式 2.5.6 自动属性 第3章 运算符和类型强制转换 3.1 运算符 3.1.1 赋值运算符 3.1.2 算术运算符 3.1.3 条件运算符 3.1.4 简化运算符 3.1.5 checked和unclaecked运算符 3.1.6 关系运算符 3.1.7 sizeo运算符和typeoiFj运算符 3.1.8 可空类型和运算符 3.1.9 空接合运算符 3.1.10 运算符的优先级 3.2 类型的安全性 3.2.1 类型转换 3.2.2 装箱和拆箱 3.3 对象的相等比较 3.3.1 引用类型的相等比较 3.3.2 值类型的相等比较 3.4 运算符重载 3.4.1 运算符的工作方式 3.4.2 运算符重载的示例:Vector结构 3.5 用户定义的数据类型转换 3.5.1 执行用户定义的类型转换 3.5.2 多重数据类型转换 第4章 C#面向对象编程 4.1 类和对象 4.1.1 面向对象概述 4.1.2 类的基本概念 4.2 类成员 4.2.1 数据成员 4.2.2 定义方法 4.2.3 定义属性 …… 第二篇 编程基础 第5章 数组和集合 第6章 字符串和正则表达式 第7章 结构化异常处理 第8章 委托与事件 第三篇 高级课题 第9章 Windows窗体 第10章 处理XML 第11章 文件和注册表操作 第12章 .NET数据访问 第13章 查的睦.NET数据 第14章 与SQL Server2008交互 第15章 基于.NET Framework编程 第四篇 Web开发 第16章 构建ASP.NET Web应用程序 第17章 ASP.NET应用 第五篇 使用.NET Framework3.5 第18章 .NET Framework3.5组 第19章 LINQ介绍

110,599

社区成员

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

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

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