c# 位运算符

2023-11-08

说来惭愧,今天看别人提供的源码,看了这些运算符竟然有些记不起来,在这里就记录一下,

首先认识这些运算符:

& :按位与,其实与&&逻辑运算符有一致的地方,下面会讲到:

| :按位或,同样与||有类似的地方。

~:按位取反

^:按位异或

<<:左移运算符

>>:右移运算符

需要注意的是上面的运算符都是针对Bit(位)进行的运算符,整数或浮点数使用这些运算符会自动进行二进制的位运算。

下面一个个来剖析。

 

&:

我们直接看示例代码:

得到的结果是 :12 ,这个就很有疑问了,我们一点点来看,首先是位运算符会把a和b进行位运算,我们先把两个数转换成二进制:

a  :0000 1101  ,  b: 0000 1110.这两个2进制使用 & 运算符是怎么计算的呢?我们下面来看:

&运算符会对二进制相同位置上面的0和1进行对比,当相同位置数字相同时就返回这个相同的数,否则就返回0,是不是和&&运算符判断两个bool 一致则返回True,否则返回False类似。所以我们得到了result这个结果,转化成十进制就是12了。

 

| :

下面的代码:

得到的结果却是15,同样的,我把 | 计算的二进制结果贴出来:

其实判断方式是一样的,只是返回的结果不一样, | 运算符判断两个二进制相同位置的0和1,只要其中一个位置的数字是1就返回1,是不是和 || 运算符同样很类似,只要一个True则返True,再把得到的结果转化成10进制就是15了。

^ :

我们还是看代码:

 

结果:

为什么是这个结果了,我们看^对两个二进制数的计算,如图:

 从中可以看出,^ 判断位置上面相同的数字时,如果两个数相同,不论是0还是1都返回0,如果其中一个为1就返回1.而 | 是只要有一个只要位置上一个为1就返回1,所以名字叫异或(不同的返回或)。

 

<< :

还是看代码:

结果:

哇,这个结果太不一样了,我们还是看运算的原理图:

可以看出<<运算符之所以叫左移,其实目的就是把符号左边二进制的位置往左边移动右边设置好的格数(我这边是a移动一格,b移动2格),然后往左移动几格后面就补几个0;所以再把得到的结果转成10进制就得到结果。

 

>> :

看看和<<有什么不同:

结果:

看看二进制的运算图:

可以看出,<<右移运算符就是把二进制位置上的数字往右边移动指定格数,移动几格就在前面补几个0(后面一篇会讲到进制方面的内容),再把结果转化成10进制。

 

~ : 

把这个留着最后因为比较特别还有点复杂,先看代码:

结果:

这个是怎么操作二进制的呢,首先要要记住一些原则,就是正数的反码,补码都是其本身的源码负数的反码是符号位不变,本身的0变1,1变0,补码就是反码+1,最后进行补码取反时连同符号位一起变得到的反码就是结果:

上图中先进行的负数的按位取反操作,首先得到反码,然后负数的补码操作是反码加1,符号位都不变,然后把得到的补码取反(符号位一起取反),得到的反码就是结果,符号位为0,结果得正。

然后进行正数的取反,首先得到正数的补码(源补码,到了这一步就开始了类似与负数取反的操作),把正数的补码进行取反,得到一个新码,既不是反码也不是补码,当做中间值进行操作,对他进行补码,不同的是负数取反是加1,那么正数取反就是减1,再次变更符号位,得到补码,然后将补码取反,得到的反码就是结果。把得到的结果转成十进制要注意,负数的符号位是不参与计算的。

经过多次实验得到一个规律就是:

~(+a)=  -(a+1);(正数按位取反只需要把当前数加1然后改成负的)

~(-a)=   (+a-1);(负数按位取反只需要把当前数先当做正数,然后减1得到结果)

以上是我对~ 的理解,下篇对进制进行解释,包括二进制,八进制,十进制,十六进制

欢迎加群:4364930讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# 位运算符 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 意外的 const 引用行为

    include
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段

随机推荐

  • 绕过__chkesp堆栈检查

    前面很多注入相关的文章中都提到为了保证注入后原始程序能恢复正常的执行流 需要在编译器中关闭堆栈检查 为了解决问题 这是个好手段 但是不得不说这是回避问题 不是根本上解决问题 本文旨在解决这个问题 vs用 chkesp来实现堆栈检查 chke
  • 工业制造业亟需数字化转型,区块链可以发挥哪些价值?

    智能信息化技术驱动的第四次工业革命正推动制造业积极拥抱物联网 云计算等新技术进行数字化 智能化转型升级 制造业是一个纷繁复杂的庞大网络 不仅涉及机器 零件 产品等实体还有机器制造商 物流公司 销售等诸多利益相关方 在当今数字化时代中 如何帮
  • 如何防止小人对你的网站进行反向代理

    引言 如果是小站或者刚建立的站 则不用担心 但如果有名气了 便可能出现小人反代你的网站 做成所谓的 镜像站点 盗版站点 这篇文章就是介绍如何防止一些简单的反代小人 实施方法 一 使用 htaccess禁止反向代理 在站点根目录下新建 hta
  • android根据物理按键上下选中listview的item,回车进入点击相应事件

    最近做扫码枪程序 因应用于冷库 用户需求在列表选择上可以用上下键代替滑动 所以做了一个小demo 记录一下 话不多说 直接上代码 1 布局文件很简单 主界面 一个输入框一个列表 因为是手持采集枪 输入框经常用到 所以在做demo的时候也加上
  • Mac终端(Terminal)自定义颜色,字体,背景 & Mac系统如何显示隐藏文件?& mac下载gcc并测试

    Mac终端 Terminal 自定义颜色 字体 背景 1 打开终端 输入 git clone git github com altercation solarized git下载Solarized 2 clone完成后 打开 然后打开 3
  • 矩阵乘法复杂度分析

    一 背景 在很多机器学习或者数据挖掘论文中 里面或多或少的涉及到算法复杂度分析 进一步思考 是如何得到的呢 很长时间里 我也感受到比较疑惑 阅读论文过程中 在涉及到这部分内容时 会直接跳过算法复杂度分析这快 其一是因为比较烧脑 虽然知道复杂
  • OpenFeign中动态URl、动态传递接口地址

    前言 在微服务盛行的今天 做接口开发请求第三方服务的接口 大概率会用feign做请求 而feign也是最常用的一种rpc框架 这里主要是说明在进行feign请求的时候 第三方服务的url和接口如何动态获取 若是该接口是作为基础服务可能会请求
  • IDEA开启后,设置工作空间位置

    欢迎加群 854228077 帮助更多java程序员提升技术 资料多 大佬多 第一步 打开IDEA
  • js中对象与函数的关系

    问题引入 new Function msg alert msg 分析某源码的时候看到这样一段代码 突然一个问题萌发了 js中对象与函数到底有什么样的关系 首先看几段代码 function test console log test inst
  • 最适合零基础学的爬虫案例,利用Python采集静态网站数据。

    前言 大家晚上好 我看到评论区有很多的零基础小白 是不怎么懂爬虫的 那么今天就教大家一个最适合新手小白的爬虫教程 就是抓取静态网站的数据 非常简单 废话不多说 直接上干货 首先如果我们想拿出来这个网址上有用的图片地址并下载下来 那就要用到了
  • RocektMQ社区"每周直播分享第7期"如约而至

    各位同学 RocektMQ社区 每周直播分享第7期 如约而至 分享题目 RocketMQ消息消费概述 直播方式 钉钉群直播方式 群号 21791227 分享时间 2019 01 17 20 00 21 30 本周四 分享讲师 费红健 内容简
  • POJ 1062 昂贵的聘礼

    题面 年轻的探险家来到了一个印第安部落里 在那里他和酋长的女儿相爱了 于是便向酋长去求亲 酋长要他用10000个金币作为聘礼才答应把女儿嫁给他 探险家拿不出这么多金币 便请求酋长降低要求 酋长说 嗯 如果你能够替我弄到大祭司的皮袄 我可以只
  • linux安装rocketmq(有效)

    1 基于java maven环境搭建 linux java 搭建 linux安装java1 8 拒绝 emo的博客 CSDN博客 linux maven搭建 linux安装maven3 2 2 拒绝 emo的博客 CSDN博客 2 下载 A
  • 七大排序算法的基本原理及实现

    目录 1 排序的概念及引用 1 1 排序的概念 1 2 常见的排序算法 2 常见排序算法的实现 2 1 基于选择的思想 2 1 1 直接选择排序 2 1 2 堆排序 2 2 基于插入的思想 2 2 1 直接插入排序 2 2 2 希尔排序 缩
  • pycharm连接MYSQL数据库

    pycharm连接MYSQL 1 gt 使用pip工具 进入cmd 输入 pip install pymysql 回车进行安装 有网络的情况下进行 安装最新版的pymysql可以使用 python m pip install upgrade
  • 希尔排序(Shell Sort)

    如今是大数据时代 大量数据需要处理 便越来越需要跟优秀的算法 算法 Algorithm 是指解题方案的准确而完整的描述 是一系列解决问题的清晰指令 算法代表着用系统的方法描述解决问题的策略机制 也就是说 能够对一定规范的输入 在有限时间内获
  • strcpy和memcpy的区别

    1 strcpy函数 1 1 函数原型 char strcpy char dest const char src 1 2 函数功能 strcpy是一种C语言的标准库函数 strcpy把含有 0 结束符的字符串复制到另一个地址空间 返回值的类
  • linux:docker compose使用已经存在的网络

    问题 如题 参考 Networking in Compose Docker Documentation services networks network1 name my pre existing network external tru
  • vue2+ElementUI时间选择器限制可选范围为今天往前7天内的任意一天

    题目有2个重点 1 可选范围为今天往前7天 含今天 2 只能选择7天内的任意一天 由此可知 用户选择的最大日期和最小日期为同一天 即只能选择一天 也就是说 使用了时间范围插件 但是model中的两个日期是同一天 HTML
  • c# 位运算符

    说来惭愧 今天看别人提供的源码 看了这些运算符竟然有些记不起来 在这里就记录一下 首先认识这些运算符 按位与 其实与 逻辑运算符有一致的地方 下面会讲到 按位或 同样与 有类似的地方 按位取反 按位异或 lt lt 左移运算符 gt gt