问题标签 [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.
bit-manipulation - 您是否曾经在实际项目中不得不使用位移位?
您是否曾经在实际的编程项目中不得不使用位移位?大多数(如果不是全部)高级语言中都有移位运算符,但是你什么时候真正需要使用它们呢?
c++ - C/C++ 检查是否设置了一位,即 int 变量
有没有这样一种方法可以检查 temp 中的第 3 位是 1 还是 0 而无需移位和屏蔽。
只是想知道是否有一些内置功能,或者我是否被迫自己写一个。
c# - 在标志上使用位运算符
我有四个标志
假设我收到了过去和未来的两个标志 ( setFlags(PAST | FUTURE)
)。我怎么知道是否Past
在里面?同样,我怎么能Current
说它不在里面?这样我就不必测试每一种可能的组合。
c - 仅使用恒定移位来模拟可变位移?
我试图找到一种方法来执行间接左/右移位操作,而无需实际使用变量移位操作或任何分支。
我正在研究的特定 PowerPC 处理器有一个按常数立即移位的怪癖,比如
是快速的、单操作的和超标量的,而一个移位变量,比如
是一个微编码操作,需要 7-11 个周期才能执行,而管道的整个其余部分都停止了。
我想做的是找出将sraw解码到哪个非微编码整数 PPC 操作,然后单独发出它们。这对自身的延迟没有帮助sraw
——它将用六个操作替换一个操作——但在这六个操作之间,我可以将一些工作双分派给其他执行单元并获得净收益。
我似乎在任何地方都找不到 μops sraw 解码到的任何地方——有谁知道我如何用一系列常量移位和基本整数运算替换变量移位?(for 循环或 switch 或任何带有分支的东西都不起作用,因为分支惩罚甚至比微码惩罚更大,即使对于正确预测的分支也是如此。)
这不需要在汇编中回答;我希望学习算法而不是特定代码,因此 C 或高级语言甚至伪代码的答案将非常有帮助。
编辑:我应该添加一些澄清:
- 我什至一点都不担心便携性
PPC 有条件移动,所以我们可以假设存在一个无分支的内在函数
(如果你写出一个做同样事情的三元组,我会明白你的意思)
- 整数乘法也是微编码的,甚至比
sraw
. :-( - 在 Xenon PPC 上,预测分支的延迟为 8 个周期,因此即使是一个也使其与微编码指令一样昂贵。跳转到指针(任何间接分支或函数指针)是有保证的错误预测,24 个周期的停顿。
assembly - SPARC - 无移位的位掩码
我正在学习 SPARC 汇编,我必须创建一个从寄存器中提取字段的脚本。该脚本接受 3 个值,初始编号、字段起始位置、字段长度。
它不能使用任何移位函数,但可以使用乘法和除法。
我目前患有呼吸道病毒,随后服用了大量药物。我很难弄清楚从哪里开始。一些方向将不胜感激。
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 等)?我应该使用枚举吗?
另请参阅如何设置、清除和切换单个位?.
java - Java 中的按位与,按位包含或问题
我在一个项目中有几行代码,我看不到......
它从文件中读取文件缓冲区,存储为字节,然后如图所示传输到缓冲区 [i],但我不明白总体目的是什么,有什么想法吗?
谢谢
java - java位操作
据我了解,java将数据存储在二进制补码中,意思是-1 = 11111111(根据维基百科)。
此外,来自 java 文档:“位模式由左侧操作数给出,而要移位的位置数由右侧操作数给出。无符号右移位运算符 >>>”将零移到最左边位置,而“>>”后最左边的位置取决于符号扩展。”
这意味着 >>> 每次都会将 0 移到最左边。所以我希望这段代码是
迭代:x的位表示
0:11111111
1:01111111
2:00111111
3:00011111
...很快
但是,我的输出始终是 X: -1,这意味着(我猜)>>> 将符号位放在最左边的位置。所以我然后尝试>>,结果相同。
这是怎么回事?我希望我的输出是:X:-1,x:127,x:63,等等。
c++ - 班次操作
我看到了其中一位 stackoverflower 同事发布的以下内容,这让我有些目瞪口呆。
有人会在以下代码片段中解释移位操作:
c - 为什么这种按位右移似乎不起作用?
有人可以向我解释为什么面具根本没有向右移动吗?你可以用任何东西代替那个 1 ,结果是一样的。