问题标签 [bit-manipulation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
42 回答
36438 浏览

bit-manipulation - 您是否曾经在实际项目中不得不使用位移位?

您是否曾经在实际的编程项目中不得不使用位移位?大多数(如果不是全部)高级语言中都有移位运算符,但是你什么时候真正需要使用它们呢?

0 投票
23 回答
319743 浏览

c++ - C/C++ 检查是否设置了一位,即 int 变量

有没有这样一种方法可以检查 temp 中的第 3 位是 1 还是 0 而无需移位和屏蔽。

只是想知道是否有一些内置功能,或者我是否被迫自己写一个。

0 投票
8 回答
32839 浏览

c# - 在标志上使用位运算符

我有四个标志

假设我收到了过去和未来的两个标志 ( setFlags(PAST | FUTURE))。我怎么知道是否Past在里面?同样,我怎么能Current说它不在里面?这样我就不必测试每一种可能的组合。

0 投票
8 回答
4154 浏览

c - 仅使用恒定移位来模拟可变位移?

我试图找到一种方法来执行间接左/右移位操作,而无需实际使用变量移位操作或任何分支。

我正在研究的特定 PowerPC 处理器有一个按常数立即移位的怪癖,比如

是快速的、单操作的和超标量的,而一个移位变量,比如

是一个微编码操作,需要 7-11 个周期才能执行,而管道的整个其余部分都停止了

我想做的是找出将sraw解码到哪个非微编码整数 PPC 操作,然后单独发出它们。这对自身的延迟没有帮助sraw——它将用六个操作替换一个操作——但在这六个操作之间,我可以将一些工作双分派给其他执行单元并获得净收益。

我似乎在任何地方都找不到 μops sraw 解码到的任何地方——有谁知道我如何用一系列常量移位和基本整数运算替换变量移位?(for 循环或 switch 或任何带有分支的东西都不起作用,因为分支惩罚甚至比微码惩罚更大,即使对于正确预测的分支也是如此。)

这不需要在汇编中回答;我希望学习算法而不是特定代码,因此 C 或高级语言甚至伪代码的答案将非常有帮助。

编辑:我应该添加一些澄清:

  1. 我什至一点都不担心便携性
  2. PPC 有条件移动,所以我们可以假设存在一个无分支的内在函数

    (如果你写出一个做同样事情的三元组,我会明白你的意思)

  3. 整数乘法也是微编码的,甚至比sraw. :-(
  4. 在 Xenon PPC 上,预测分支的延迟为 8 个周期,因此即使是一个也使其与微编码指令一样昂贵。跳转到指针(任何间接分支或函数指针)是有保证的错误预测,24 个周期的停顿。
0 投票
1 回答
2185 浏览

assembly - SPARC - 无移位的位掩码

我正在学习 SPARC 汇编,我必须创建一个从寄存器中提取字段的脚本。该脚本接受 3 个值,初始编号、字段起始位置、字段长度。
它不能使用任何移位函数,但可以使用乘法和除法。
我目前患有呼吸道病毒,随后服用了大量药物。我很难弄清楚从哪里开始。一些方向将不胜感激。

0 投票
8 回答
12759 浏览

c++ - 如何在 C++ 中使用按位标志?

根据这个网站,我希望用一个 16 位整数的二维数组来表示一个迷宫。

每个 16 位整数需要保存以下信息:

这是一种方法(这绝不是唯一的方法):12x16 迷宫网格可以表示为 16 位整数的数组 m[16][12]。每个数组元素将包含网格中单个对应单元格的所有信息,整数位映射如下:

替代文字
(来源:mazeworks.com

要推倒一堵墙、设置边界或创建特定路径,我们需要做的就是翻转一个或两个数组元素中的位。

如何在 16 位整数上使用按位标志,以便我可以设置每个位并检查它们是否已设置。

我想以一种易于阅读的方式进行(即 Border.W、Border.E、Walls.N 等)。

这通常如何在 C++ 中完成?我是否使用十六进制来表示每一个(即 Walls.N = 0x02、Walls.E = 0x04 等)?我应该使用枚举吗?


另请参阅如何设置、清除和切换单个位?.

0 投票
7 回答
6075 浏览

java - Java 中的按位与,按位包含或问题

我在一个项目中有几行代码,我看不到......

它从文件中读取文件缓冲区,存储为字节,然后如图所示传输到缓冲区 [i],但我不明白总体目的是什么,有什么想法吗?

谢谢

0 投票
5 回答
17372 浏览

java - java位操作

据我了解,java将数据存储在二进制补码中,意思是-1 = 11111111(根据维基百科)。

此外,来自 java 文档:“位模式由左侧操作数给出,而要移位的位置数由右侧操作数给出。无符号右移位运算符 >>>”将零移到最左边位置,而“>>”后最左边的位置取决于符号扩展。”

这意味着 >>> 每次都会将 0 移到最左边。所以我希望这段代码是

迭代:x的位表示

0:11111111

1:01111111

2:00111111

3:00011111

...很快

但是,我的输出始终是 X: -1,这意味着(我猜)>>> 将符号位放在最左边的位置。所以我然后尝试>>,结果相同。

这是怎么回事?我希望我的输出是:X:-1,x:127,x:63,等等。

0 投票
3 回答
846 浏览

c++ - 班次操作

我看到了其中一位 stackoverflower 同事发布的以下内容,这让我有些目瞪口呆。

有人会在以下代码片段中解释移位操作:

0 投票
4 回答
2670 浏览

c - 为什么这种按位右移似乎不起作用?

有人可以向我解释为什么面具根本没有向右移动吗?你可以用任何东西代替那个 1 ,结果是一样的。