星空网 > 软件开发 > ASP.net

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

回到目录

进制

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

二进制里的最简单的运算

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

自然数据2的奥秘

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

位移运算的结果

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

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

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

我们看一下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里的3,7,15,31,63,127,255,511,1023,2047

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

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

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

感谢各位的阅读!

回到目录




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

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

运费高企,如何构筑大件产品的跨境蓝海?:https://www.ikjzd.com/articles/137508
一个合格的SEO应该具备什么样的素质:https://www.ikjzd.com/articles/137509
新问世!Twitter推文编辑器,花更少时间创建推文!:https://www.ikjzd.com/articles/137510
跨境日报 ︳商务部:中国已启动RCEP国内核准程序:https://www.ikjzd.com/articles/137511
跨境电商选品攻略:当家庭办公室越来越受欢迎:https://www.ikjzd.com/articles/137512
2020什么最好赚?全年爆款商品大总结!:https://www.ikjzd.com/articles/137513
2024深圳龙岗区文化馆免费音乐培训课程安排+报名方式:https://www.vstour.cn/a/366181.html
Keep上市后首份财报:亏损同比收窄55.7% :https://www.kjdsnews.com/a/1836654.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流