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

回到目录

进制

我是一个程序猿,我喜欢简单的数字,十进制如何,数字太多,有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》相关代码和程序的截图!

感谢各位的阅读!

回到目录

时间: 2024-08-08 06:57:02

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

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

回到目录 关于Lind.DDD.Manager的培训与学习 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD,Lind.DDD.Manager 关于Lind.DDD.Manager 由于数据模型,数据库初始化(Code.First自动升级数据库或者进行数据库版本的迁移)控制器,View视图,css,js等元素组件的一套标准的后台管理系统框架,可以直接应用到任何一个系统上,可以它将发布到Nuget上,以后安装和更新更加方便. 如何为你的项目安装Lind.DDD.Manager Lind在n

Lind.DDD.Domain.IOwnerBehavor对实体的意义

回到目录 对于Lind.DDD架构,我之前写了不少文章,对于它的Domain模式也介绍了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatusBehavor和ISortBehavor都有自己的功能,只要实体实现对外的接口,就具有了某种特性或者某种功能,而今天主要说一下拥有者接口,IOwnerBehavor,它主要用在管理系统的实体中,如一个员工资产表,当这个员工离职后,它对应资产将被进行转移,转移到一个新的用户身上,而这个用户就是这个资

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

回到目录 大家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身Email和SMS没什么关系,它们也不会有什么接口约定,即你想实现某种消息的多态发送,不需要程序代码,基本不可能实现,而在Lind.DDD里面,大叔将它进行了抽象,消息有自己的统一接口,而对于email和sms只是一种实现而以,这样,就可以发挥面向对象的特性,在sms,email甚至是rtx上进行消息的灵活切换了,说到这样,您心动了吧! Lind.

Lind.DDD.Domain.ISortBehavor~上移与下移

在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如果实体对象支持排序功能,可以实现这个接口,而在扩展库中,将有为本地结果集动态排序(上移和下移)的方法,这个设计类似于ABP项目里的软删除,当然在大叔LIND里也有对删除的逻辑操作. ISortBehavor内容 class Entity { public int ID{ get; set; } }

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

回到目录 在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大叔又设计了DynamicModules,它在系统初始化时将需要的模块进行注册,然后统一使用它即可. 完美的模块注册 //添加默认模块和全局模块 var config = DynamicModule.Create() .RegisterGlobalModule() .UseLogger() .UseM

Lind.DDD.API核心技术分享

回到目录 关于Lind.DDD框架里API框架的技术点说明 讲解:张占岭 花名:仓储大叔 主要框架:Lind.DDD 目录 关于Lind.DDD.Authorization 关于授权的原理 关于ApiValidateModelConfig 关于Lind.DDD.CacheConfigFile 如何为你的API项目注入授权模块 关于服务端收取过滤器ApiValiadateFilter 如何在客户端生产加密授权串 关于请求类与响应类 客户端如何做分页 关于Lind.DDD.Authorization

Lind.DDD.Events领域事件介绍

回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托,哪个是事件,搞的大家是糊里糊涂,进入C#2.0时代后,大叔也买了一本书,对于delegate和event这两个知识点看了至少有20几遍,感觉稍微有点明白了,明白了其中的真谛和用意. 委托:方法的规范,方法的模板,可以代表一类方法的集合 事件:委托的实例,事件在使用之前需要为它赋值,当然赋的就是一个

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

回到目录 关于Lind.DDD.Api的使用与客户端的调用 作者:张占岭 花名:仓储大叔 框架:Lind.DDD,Lind.DDD.Api 目录 Api里注册全局校验特性 1 Api中设置全局的Cors跨域资源访问 2 Api直接返回Json,而不是Xml 2 Api中Controller的Get,Post,Put和Delete 3 Api中Controller几大方法重载要注意的 3 客户端如何调用Api 4 对ResponseMessage的结果按需返回 5 对ResponseMessage

Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制 仓储大叔好了相赠 网上2500元 跟谁学课堂 C#视频 ddd领域驱动架构设计视频 还赠送ABP视频两套 qq 2589406800 qq1399494644 qq2128543647 qq2890083872 qq3235634116 qq3381945576 qq2171713479源代码框架lind.ddd(后台管理系统,电商系统,API,SSO,xamarin,ko,各组件单元测试) 赠送