你可能不知道的按位与、或运算技巧

背景

最近在园子里看到了这篇文章,

看完这篇会有意外收获:C#枚举高级战术

https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg

想起了很久之前的自己的一篇总结,特地找出来

说说概念

在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下午的时间搞明白其中的道理。

首先每一个权限数都是2的N次方数

如:k1=2 ; //添加

          k2=4 ; //删除

          k3=8; //修改

          ...

如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。

如:

         purview = k2|k3; // 赋给添加和删除权限

当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。

如:

         if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中

          {

                 ....

          }     

说到这里肯定会有疑问了,别急我来细细讲解。

   第一,2的8位二进制值为00000010

                 4的8位二进制值为00000100

                8的8位二进制值为00001000

第二,当对8和4进行按位或操作后,结果为:

                 4|8 = 12

                 00000100 |00001000 = 00001100

              为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001   ;00000001|00000000=1 ;00000000|00000000=00000000

              也就是说除了0|0结果是0外,其它运算结果的都是1

             所以    00000100 |00001000 = 00001100

            也就说上面的 purview = k2|k3 的二进制值结果是 purview =00000100 |00001000 =00001100了

第三,当对8和4进行按位与操作后,结果为:

               4&8=0

            00000100 &00001000 = 00000000

              同样为什么会是这样呢?在进行按位与操作时 00000001&00000001=00000001   ;00000001&00000000=00000000 ;00000000&00000000=00000000

            也就是说除了1&1结果是1外,其它运算结果的都是0

            所以 00000100 &00001000 = 00000000

            上面的if((purview & k1) >0)的结果就是 00001100&00000010 =00000000 也就是(0>0)=false

           同样if((purview & k2) >0)的结果就是 00001100&00000100 =00000100=4=k2 也就是 (4>0)=true

 

这样我们就理解组合权限串和判断权限的原理了,说白了就是对2N次方数的按位与和按位或。

应用场景

比如在做一些社交类的需求中,经常会遇到那种点赞,推荐,明天再加个置顶的,简直没完没了,总不能今天加个字段,明天再加个吧;这时候位运算就派上用用场了,每个属性一个2N次方数,枚举定义下去,这样一个字段即可解决,新来一个属性再加个枚举即可。

代码实现

来个核心方法

/// <summary>
/// 计算权限总和
/// </summary>
/// <param name="OldStatus">数据库现有权限总和</param>
/// <param name="Action">取消或设置操作(0取消,1设置)</param>
/// <param name="StatusVal">设置操作对应的状态值</param>
/// <returns></returns>
public static int ReturnStatusTotal(int OldStatus, int Action, int StatusVal)
{
int NewStatus = OldStatus;
if (Action == 1)
{
//判断此权限串是否拥有相应操作,不包括时加入权限
if ((OldStatus & StatusVal) <= 0)
{
NewStatus = OldStatus | StatusVal;
}
}
else
{
//判断此权限串是否拥有相应操作,有权限时移除权限
if ((OldStatus & StatusVal) > 0)
{
NewStatus = OldStatus & ~StatusVal;
}
}
return NewStatus;
}NewStatus = CommonUtilities.ReturnStatusTotal(OldStatus, objRequest.Action, (int)StatusEnum.ZhiDing);

总结

有时候一个不经意的小窍门,可以帮我们解决大麻烦,所以基础很重要!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web高德地图怎么加载离线地图_怎么验证全国离线卫星地图缓存文件的完整性

1. 概述自从我们发布了《如何离线浏览全国7137GB海量谷歌卫星离线影像》一文后&#xff0c;很多用户都在问下载海量数据的具体方法&#xff0c;为了解决大家的困惑&#xff0c;于是又分别发布了《如何一次性下载全国谷歌卫星影像地图数据的方法》和《如何一次性下载谷歌地球的全…

为什么程序员发现不了自己的BUG?

最近在朋友圈流行了这样的一个小学数学题&#xff0c;当然结果是“出乎意料”&#xff0c;看似简单的结果&#xff0c;几乎很少有人做对&#xff0c;而分析下来的原因无非是惯性思维下的粗心导致的完全错误&#xff0c;今天小编就带大家一起分析下思考过程。看图可知&#xff0…

IP代理在网络游戏中的应用

前些天同学开了打钱工作室&#xff0c;想玩外服魔兽打点游戏B赚点钱&#xff0c;可是不会上外国魔兽&#xff0c;叫我帮忙给看看怎么才能玩外服。现在我就来做个简单的教程&#xff0c;说明一下怎么玩外服吧。先说明一些现状&#xff1a;一些海外网络游戏服务器和带宽资源有限&…

python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行

转不到“玩家1”的原因是你的支票中缺少一个空格。你也没有正确地检查一个玩家何时获胜,这就是为什么你会有这种奇怪的行为。你需要检查每个位置,而不仅仅是最后一个。我还添加了对用户输入的检查,以确保用户输入的是一个数字,如果不是,它不会崩溃。我完全不明白为什么你基本上…

Csv解析CsvFile

Excel导出是非常常见的需求&#xff0c;而大多数时候只需要导出CSV格式文件即可。Csv文件非常简单以及快速&#xff0c;除了日常导出报表&#xff0c;还可以导出大量数据用于跨系统数据交换&#xff0c;曾经多次遇到一次性导出数百万行数据。NewLife.Core 内封装了CsvFile类&am…

java流的序列化_Java中的对象流和序列化介绍

最近&#xff0c;在讲流的使用&#xff0c;其中对象流的作用其实就是将自定义类的对象与流之间相互转换的流。看起来还是挺简单的&#xff0c;那么看下面的例子&#xff1a;public class Student{private int id;private String name;private String sex;private String tel;//…

【干货】人人都能看懂的LSTM

推荐阅读时间&#xff1a;8min~13min推荐理由&#xff1a;这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想。看完介绍的第一部分RNN尤其LSTM的介绍之后&#xff0c;整个人醍醐灌顶。10. 从RNN说起循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RN…

Csv数据库CsvDb

在工控领域&#xff0c;经常遇到断电关机数据库文件损坏的情况&#xff0c;SQLite如此&#xff0c;LiteDb也是这样。ZTO有数万自动化扫描设备&#xff0c;每天都有数百台设备因断电数据库损坏等原因&#xff0c;而不得不重装软件。因此&#xff0c;设计了CsvDb&#xff0c;用于…

Lucene的一些基本使用方法和概念 (JAVA)

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大&#xff0c;但api其实很简单的&#xff0c;它最主要就是做两件事:建立索引和进行搜索。1. 建立索引时最重要的几个术语* Document&#xff1a;一个要进行索引的单元&#xff0c;相当于数据库的一行…

java jdbc分页_使用JDBC进行分页查询

package day03;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;import day01.JdbcUtil;/** 演示&#xff1a;JDBC的批量处理*/public class Demo3 {public static void main(String[] args) {// testI…

python计算四舍五入_Python实现小数四舍五入的方法

对小数在Python中实现四舍五入的方法&#xff0c;不能使用round函数&#xff0c;round函数的执行的是HALF EVEN&#xff0c;不是四舍五入(HALF UP)。而使用decimal模块提供的接口&#xff0c;就可以精确实现十进制小数的四舍五入。本文对这个topic进行详细介绍。Python的浮点数…

一位像素艺术家用39张动图,将大自然的唯美尽收眼底…

Lioness 是一位像素艺术家&#xff0c;会制作 Gifs、icons、实体模型以及像素艺术教程等等。但其实&#xff0c;他的大部分精力集中在大自然灵感艺术&#xff0c;“Natural Palettes”便是其中一个项目。在这个项目里面&#xff0c;除了常见的配色图片以外&#xff0c;以 GIF 形…

一起学习设计模式--02.简单工厂模式

工厂模式是最常用的一类创建型设计模式。我们所说的工厂模式是指工厂方法模式&#xff0c;它也是使用频率最高的工厂模式。简单工厂模式是工厂方法模式的小弟&#xff0c;它不属于GoF 23种设计模式&#xff0c;但是在软件开发中应用也颇为频繁&#xff0c;通常将它作为学习其它…

python list remove 删除引用_Python——list列表操作一坑(remove)

问题发生背景&#xff1a;在一个对象被调用多次时候对象存入了列表暂时保存(主流程不能断开使用了while True)&#xff0c;然后实例化了大批对象&#xff0c;具体你可参考打飞机游戏或者坦克大战发射子弹&#xff0c;每个子弹一个实例&#xff0c;创建的多到一定时候肯定是要释…

雨后漫步长安街

雨后漫步长安街&#xff0c;四处是祖国60华诞的味道&#xff0c;和城楼合个影&#xff0c;待百年庆典的时候拿出来看一定别有一番滋味。那时我都是老婆婆了……转载于:https://blog.51cto.com/xurui/200059

hive 导入mysql数据库_求助 Hive 导入MYsql 数据库 报错啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼sqoop export \--connect "jdbc:mysql://localhost:3306/emp?characterEncodingUTF8" \--username root \--password 123456 \--input-fields-terminated-by , \--table t_dim_sqoop \--export-dir /user/hive/warehous…

聊一聊Load Average

背景 前段时间&#xff0c;由于有几个应用引入了 prometheus-net.DotNetRuntime 这个组件&#xff0c;导致系统 CPU 间歇性飙升。这是这个组件一个已知的雷。。同样也引发了系统的 Load Average (平均负载) 十分不正常。这是一台 4C8G 的服务器&#xff0c;Load Average 却是达…

我的邮局系统,欢迎大家注册!hotxf.com

我的邮局系统&#xff0c;欢迎大家注册&#xff01;hotxf.com mail.hotxf.com 可用于登陆MSN和邮件&#xff0c;25G网络硬盘我在使用 Windows Live 为 hotxf.com 托管电子邮件。我想邀请您在 hotxf.com 中创建电子邮件地址。您可以通过单击 https://domains.live.com/m…

优雅的读懂支持向量机 SVM 算法

转自&#xff1a;JerryLeadhttp://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html简介支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候&#xff0c;老师要求交《统计学习理论》的报告&#xff0c;那时去网上下了一份入门教程&#xff0…

python socket自动重连_详解python3中socket套接字的编码问题解决

一、TCP1、tcp服务器创建#创建服务器from socket import *from time import ctime #导入ctimeHOST #任意主机PORT 21567 #随机提供个端口号BUFSIZ 1024 # 缓冲区大小设置为1KB&#xff0c;可以根据网络性能和程序需要改变这个容量ADDR (HOST, PORT)tcpSerSock socket(AF_…