回到目录

进制

我是一个程序猿,我喜欢简单的数字,十进制如何,数字太多,有10种数字组成,但由于它广为人知,所有使用最为广泛,人们的惯性思维培养了十进制,并说它是最容易被计算的数字,事实上,在计算机里,最简单的进制是当然是二进制,原因最为直接,因为它只有两种数字,0和1。

二进制里的最简单的运算

不是加,也不是减,而是位移,即将数字水平向左或者向右进行移动,在数学里的实际意义就是乘以2和除以2,对于每种高级程序设计来说都有自己的位运算符,大多部都使用<<和>>来表示,对于位运算,它有自己的实际意义,对于自然数字2来说,它的实际意义是什么呢?让我们来一起看一下。

自然数据2的奥秘

十进制:2,对应二进制的10

位移运算的结果

对上面的结果,我们可以看到2的位移运算刚好是2的N次幂,这个确实很有意思,但还不是最有意思的,对于数字来说还有一些位运算,下面我们来看一下图示。

我们看一下2的指数,分别是1到10在,而它的幂我们是否很熟悉,这在计算机设置里经常可以看到,你的内存,硬盘,U盘,显卡上的存储存量应该都有它们的身影,我们可以试着把这些幂进行按位取或,看一下结果

1 | 2=3

1 | 2 | 4=7

1 | 2 | 4 | 8=15

1 | 2 | 4 | 8 | 16 =31

1 | 2 | 4 | 8 | 16 | 32=127

实际意义

这个有点像杨辉三角的东西在我们平时开发时经常会用到,因为对于这些结果都只有唯一的结合,我们如果把每位代表一种权限,那么,可以把这些结果代表这些权限的组合,这确实很有意思,而在这些组合里,我们也可以查找哪些元素(权限)不在某个结果之内,这些都可以使用位移运算实现。

    /// <summary>/// 从位集合中找到空位/// </summary>/// <param name="max"></param>/// <param name="he"></param>/// <returns></returns>long GetValidNumber(long he){for (long i = 1; i < he; i = i << 1){if ((he & i) != i)return i;}return 0;}

大叔曾经也对一些聚合运算进行了扩展,对sum,count这些聚集来说,位运算是不适合的,如果我们希望对一个集合进行按运求和(或),如何去实现了,.net基础类库没有这种方式,所以,大叔对它进行了扩展,代码如下

      /// <summary>/// 按或进行位运算/// 作者:仓储大叔/// </summary>/// <typeparam name="TSource"></typeparam>/// <param name="source"></param>/// <param name="selector"></param>/// <returns></returns>public static long BinaryOr<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector){long result = 0;foreach (var item in source){result |= selector(item);}return result;}

对于上面的位移运算来说,它们的实现意义在大叔的权限体系里得到了完美的体现,我们可以看一下数据表的设计,使用Flag来设计授权按钮,即每种按钮都有唯一的位标识,而它们可以相互组合!

授权按钮组件的结果

对于角色授权时,你可以将多种按钮组合授权,而使用一个字段来存储位运算的结果即可,无论从效率还是操作上,都比拼字符串和关系表来的更容易!

本代码选自《Lind.DDD.Manager》相关代码和程序的截图!

感谢各位的阅读!

回到目录

Lind.DDD.Manager里的3,7,15,31,63,127,255,511,1023,2047相关推荐

  1. Lind.DDD.Manager里菜单权限的设计

    对于一个后台管理系统来说,你的权限设计与安全是重中之重,当你为一个权限分配一些菜单后,当这个权限的用户没有菜单权限时,这个菜单的URL是不可以被用户访问的,而在之前的设计中,没有考虑到这点,所以本次L ...

  2. Lind.DDD敏捷领域驱动框架~介绍

    最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...

  3. Lind.DDD.Manage项目核心技术分享

    回到目录 关于Lind.DDD.Manager的培训与学习 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD,Lind.DDD.Manager 关于Lind.DDD.Manager 由于数据模 ...

  4. Lind.DDD.DynamicModules动态模块化的设计

    回到目录 在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大 ...

  5. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis驱 ...

  6. Lind.DDD.API核心技术分享

    关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于ApiValid ...

  7. 关于Lind.DDD.Api客户端的使用与知识分享

    回到目录 关于Lind.DDD.Api的使用与客户端的调用 作者:张占岭 花名:仓储大叔 框架:Lind.DDD,Lind.DDD.Api 目录 Api里注册全局校验特性 1 Api中设置全局的Cor ...

  8. Lind.DDD.SSO单点登陆组件的使用(原创)

    回到目录 一般sso的说明 在Lind.DDD框架里,有对单点登陆的集成,原理就是各个网站去sso网站统一登陆授权,之后在sso网站将登陆的token进行存储,存储方式随你(cache,redis,m ...

  9. Lind.DDD.Messaging框架通讯组件介绍

    大 家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身 Email和SMS没什么关系,它们也不会有什么接口约定, ...

最新文章

  1. 原版英文书籍《Linux命令行》阅读记录4 | 操作文件和目录
  2. 监测div大小变化_CSS怎么实现div随着网页的大小变化而变化呢?
  3. 如何访问docker内php,如何进入docker容器
  4. require.js初识
  5. 【报告分享】新基建风口下,零售科技企业如何借势发展.pdf(附下载链接)
  6. React.js组件化开发第一步(框架搭建)
  7. 使用Python将Excel文件中的数据插入MySQL数据库,你学会了吗?
  8. 系统架构技能之设计模式-单件模式
  9. html如何设置hr 标签的线条粗细,html中hr怎么设置粗细
  10. 产品经理数据分析入门
  11. oracle导入源数据库文件,将dmp文件数据导入oracle数据库
  12. 第二章:真分数理论(真分数模型:概念、假设、平行测验)
  13. 转 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)
  14. echarts-gl中3d曲面UV参数详解
  15. 戴尔笔记本DELL 5557 解锁 CFG lock
  16. 时序约束——set_max_delay和set_min_delay用法
  17. Mendix公司最新调查结果显示:低代码已从企业机构应急技术进阶为核心技术
  18. M2DGR:多源多场景 地面机器人SLAM数据集(ICRA 2022 )
  19. 力扣-594-最长和谐子序列-map 《count》
  20. hrbust 2155 钱多多【水题】

热门文章

  1. 题解 P1876 【开灯】
  2. 33 -jQuery 属性操作,文档操作(未完成)
  3. 使用a标签调用手机系统的一些小技巧(打电话、发短信)
  4. iOS项目架构 小谈
  5. 几种常用控件的使用方法
  6. 【原创-长文】openstack 版本D安装配置及本次安装中遇到的问题
  7. 转载--C语言:浮点数在内存中的表示
  8. 快速对比UART、SPI、I2C通信的区别与应用
  9. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)
  10. Linux进程间通信(管道、消息队列、共享内存、信号、信号量)