按位运算符的结果是如何产生的?

2024-04-14

我很惊讶我在谷歌上找不到这个听起来简单的问题的答案。在检查了大约十几个不同的页面之后,我只想在这里问......

根据这一页 http://www.leepoint.net/notes-java/data/expressions/bitops.html, 3 & 5 结果为 1。此外,3 | 5 结果是 7。我唯一的问题很简单:

  • 我们怎样才能得到 3 和 5 的 1 呢?
  • 如何以 3 换 7 | 5?

另外,负数怎么办?

  • 8 & -8 怎样得到 8?

果然,用java编写了以下内容:

System.out.println(3&5);
System.out.println(3|5);
System.out.println(8&-8);

产生以下输出:

1
7
8

但同样,这些结果是如何确定/计算的?


3 和 5:

0011
0101
----- AND
0001 == 1

3 | 5:

0011
0101
----- OR
0111 == 7

Java 中的否定定义为二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement否定(这是极其常见的)。
So -x = ~x + 1 = ~(x - 1).

8 和 -8:

00001000 //8
11111000 //-8
-------- AND
00001000 // 8

使用最后一个否定定义,-1 首先借用所有最右边的零(如果有的话),按原样设置它们,直到它达到 1,它会重置它,其左侧的任何内容都保持不变。然后补码恢复最右边的 0 和最右边的 1(所有这些都被 -1 有效补足),并对最右边的 1 左边的所有内容求补:

00001000 // 8
00000111 // 8 - 1 = 7
11111000 // -8

请注意,如果您使用 8 位数字,则 -8 只是 11111000。如果有更多的位,左边就会有更多的 1。如果只有 4 位,则会遇到某种麻烦,因为 -8 与 8 具有相同的表示形式,因此 -8(在 4 位数学中)是一个本身为负数的数字(如零)。

实际上,8并不是一个很好的例子,因为它太简单了。让我们做100 & -100(一百,而不是四):

01100100 // 100
01100011 // 99
10011100 // -100

现在&100:

01100100 // 100
10011100 // -100
-------- AND
00000100 // 4

一般来说,x & -x隔离最右边的 1。最右边的 0 和最右边的 1 都不受否定的影响,因此仅对于数字的那部分,看起来您正在做x & x(这当然是x)。最右边的左边的上半部分是补码,所以凡是 1 的地方都变成 0,凡是 1 的地方都变成 0。0 & 1 = 0,因此到处都是 0。

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

按位运算符的结果是如何产生的? 的相关文章

随机推荐

  • 如何计算贝塞尔曲线上的控制点?

    我确实有一条贝塞尔曲线 在某个点上 我想要第二条贝塞尔曲线以平滑的方式 分支 第一条曲线 除了计算交点 贝塞尔曲线后面的百分比 之外 我还需要控制点 切线和权重 交点是通过以下 javascript 计算的 getBezier functi
  • 使用 .NET 填充 html 列表控件

    我有一个如下定义的列表 ul class myClass li class myItemClass Item 1 li li class myItemClass Item 2 li ul 使用 NET 如何动态地将项目添加到列表中 我还需要
  • Telegram Bot getUpdates VS setWebhook

    我想为企业开发一个机器人 我不知道使用获取更新 https core telegram org bots api getupdates开发 Windows 桌面应用程序并在 vps 上运行该应用程序的方法 通过https github co
  • 使用 React 动态更改输入文本时如何启用 Ctrl + Z?

    我正在尝试创建一个简单的React Markdown 编辑器 https github com andrerpena react mde 该组件是完全受控的 问题是 如果用户选择abc在文本区域中并单击B按钮 我需要打电话onchange
  • 将函数指针转换为另一种类型

    假设我有一个函数接受void void 用作回调的函数指针 void do stuff void callback fp void void callback arg 现在 如果我有一个这样的函数 void my callback func
  • Flyway可以从数据模型中找到并生成迁移文件吗?

    大家好 我一直在看 Flyway 但我不确定如何使用它 就我而言 我有一个实体模型 使用 JPA 注释 对我来说 有用的是 FlyWay 可以在我每次调用 迁移 并生成迁移文件时找出模型上的更改 这就是 Rails 等的工作方式 Rails
  • 解释一下Smalltalk的一段代码?

    我无法理解这段 Smalltalk 代码 line self upTo Character cr size 0 whileTrue 有人可以帮忙解释一下吗 如果您有代码来源的映像 可以做的一件简单的事情就是在其上运行调试器并单步执行 如果您
  • iOS 模拟器无法访问任何 URL 并显示错误“此连接不是私有的”

    我遇到了一个问题 我的 iPhone 模拟器无法访问 SAFARI 上的任何网站 我也无法从我的应用程序调用任何 API SAFARI 显示的错误是下面提到的两个错误之一 此连接不是私有的 Refer Screenshot OR Safar
  • 如何优化多图像拼接?

    我正在 Visual Studio 2012 C 中进行多图像拼接 我已经修改了缝合 详细 cpp https github com opencv opencv blob master samples cpp stitching detai
  • 查询返回准确的行数

    我有一个表存储两个外键 实现 n m 关系 其中一个指向一个人 subject 另一个针对特定项目 现在 一个人可能拥有的物品数量在另一个表中指定 我需要一个查询 该查询将返回与一个人可能拥有的物品数量相同的行数 其余记录可以填写NULL价
  • ElectronJS - 在窗口之间共享 redux 存储?

    我有一个基于的电子应用程序electron react boilerplate 现在 我有一个窗口按照我希望的方式运行 我开始创建一个新窗口 我目前有 2 个 html 文件 每个窗口一个 包含 div 根 div div div div
  • 父控件的 WPF ContextMenu 在具有自己的 ContextMenu 的子控件上打开

    我在基于 Canvas 的 WPF 中制作了一个相当不错的 NodeGraph 现在我正在通过右键单击菜单添加一些漂亮的功能 这些菜单是上下文相关的 这意味着右键单击图形的背景将显示图形 ContextMenu 而右键单击图形中的节点将显示
  • 将DBContext服务添加到Worker项目中的program.cs中

    对于这一切还相当陌生 所以如果我做了任何愚蠢的事情 我深表歉意 我正在尝试实现一个与我设置的本地 SQL Server Express 数据库进行通信的工作项目 我将连接字符串存储在我的AppSettings Json如下所示 Loggin
  • 为什么 printf 仍然可以在 RAX 小于 XMM 寄存器中 FP 参数数量的情况下工作?

    我正在关注Linux 64系统中的 开始x64汇编编程 一书 我正在使用 NASM 和 gcc 在关于浮点运算的章节中 本书指定了以下用于添加 2 个浮点数的代码 在本书和其他在线资源中 我读到寄存器 RAX 根据调用约定指定要使用的 XM
  • 将数组作为声音播放并并行记录其输出

    我知道 Octave MATLAB 可以将数组作为声音播放 但我想知道 Octave 是否可以做到这一点 我想循环播放一系列频率 并让 Octave 使用计算机上的扬声器播放它们 并让 Octave 也记录使用麦克风输入的声音来获取最大值
  • 关于僵尸进程和线程的问题

    自从我阅读一些有关进程和线程的新主题以来 我脑海中浮现出这些问题 如果有人能帮助我 我会很高兴 1 如果一个线程被标记为不可取消 然后该进程在临界区内被终止 会发生什么 2 我们的程序是否有操作系统已知的主线程 我的意思是操作系统是否给予程
  • MSYS2环境的使用

    我想彻底了解MSYS2平台环境的使用情况 部分描述可在以下位置找到 https www msys2 org docs environments https www msys2 org docs environments 我理解的事情 MSY
  • 如何在 MongoDB 的 Linq 查询中使用 .Contains 和 ToLower?

    MongoDB C Linq 如何在 Linq 查询中使用 contains 和 ToLower List
  • 正则表达式将 10 位数字与特定模式完全匹配

    假设我给出一个模式 123 或 1234 我想匹配以该模式开头的任何 10 位数字 它应该正好有 10 位数字 Example 模式 123 应匹配 1234567890 但不匹配 12345678 我尝试了这个正则表达式 123 d 0
  • 按位运算符的结果是如何产生的?

    我很惊讶我在谷歌上找不到这个听起来简单的问题的答案 在检查了大约十几个不同的页面之后 我只想在这里问 根据这一页 http www leepoint net notes java data expressions bitops html 3