问题标签 [bit-shift]

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 投票
4 回答
4670 浏览

actionscript-3 - AS3按位移0?

我在一些 AS 3.0 代码中遇到了这个问题:

其中持续时间是一个Number. 我想我知道按位右移是做什么的,但是移动 0 位有什么意义呢?这在代码中发生了几次,我想了解它的作用。

0 投票
5 回答
651 浏览

c - (-1 >> 1) == -1 - 为什么?

为什么会(-1 >> 1)导致-1?我在 C 中工作,但我认为这不重要。

我无法弄清楚我错过了什么......

下面是一个执行计算的 C 程序示例:

0 投票
6 回答
348 浏览

c - 这行代码有什么作用?

对这段代码的作用感到困惑

特别是这个“ N_half>>=1 ”

谢谢

0 投票
14 回答
81938 浏览

java - Java:检查一个位是长的0还是1

您将使用什么方法来确定表示 2^x 的位是 1 还是 0 ?

0 投票
1 回答
1128 浏览

c - 使用编译器警告捕获常量 1 左移的溢出?

我们在 Linux 内核中编写代码,所以尽我所能,我无法让 PC-Lint/Flexelint 在 Linux 内核代码上工作。内置符号等太多了。但这是一个附带问题。

我们有任意数量的编译器,从 gcc 开始,但也有其他的。随着时间的推移,它们的警告选项越来越强大,它们也是非常强大的静态分析工具。

这是我想要捕捉的。是的,我知道它违反了一些在代码审查中很容易发现的东西,例如“没有幻数”和“当心位移”,但前提是你碰巧看到了那段代码。无论如何,这里是:

进一步更新的问题描述——即使 bar 限制为 16,仍然是一个问题。澄清一下,问题是隐含的 int 类型的常量,它在计划外使复杂的表达式违反了所有计算都以相同的大小和符号进行的规则。

问题:'1' 不是 long long,但作为一个小值常量,默认为 int。因此,即使 bar 的实际值从未超过,例如 16,(1<<bar)表达式仍然会溢出并破坏整个计算。

可能正确的解决方案:改为写 1ULL。

是否有一个众所周知的编译器和编译器警告标志会指出这个(修订的)问题?

0 投票
4 回答
3822 浏览

c# - 在c#中将两个uint组合成ulong的最佳方法是什么

在 c# 中将两个 uint 组合成一个 ulong 的最佳方法是什么,设置高/低 uint。

我知道位移可以做到这一点,但我不知道语法,或者可能有其他 API 可以提供帮助,例如 BitConverter,但我没有看到可以满足我要求的方法。

0 投票
4 回答
10173 浏览

c++ - 在 C++ 中,1 和 1i64 有什么区别?

我正在将一些 32 位兼容代码转换为 64 位 - 我遇到了障碍。我正在编译一个 VS2008 x64 项目,我收到以下警告:

这是原始代码行:

如果我遵循微软的建议,这就是它的样子:

当代码将在 32 位和 64 位系统上编译时,这样做安全吗?如果是这样,请解释为什么我必须在末尾添加“i64”,以及为什么这不会影响 32 位编译。否则,将不胜感激。

除此之外,我还有一些看起来更棘手的代码。

我知道“u”表示该数字是无符号的,但是在不超过有符号最大值的值上指定它有什么意义......我猜这与位移有关?

0 投票
5 回答
6247 浏览

c# - 将字节数组位移 N 位

你好关于位移的快速问题

我有一个十六进制值:new byte[] { 0x56, 0xAF }; 这是0101 0110 1010 1111

我想要前 N 位,例如 12。

然后我必须右移最低 4 位 (16 - 12) 以获得0000 0101 0110 1010(1386 dec)。

我无法绕开它并使其可扩展为 n 位。

0 投票
4 回答
444 浏览

c++ - 复杂表达式中的位移问题

我已经提炼出一个方程式:

但由于某种原因,我得到了意想不到的结果,所以我一定做错了什么。这开始是这样的:

那是完全不简化的版本。它们不是数学上的等价物吗?

所有值都是带符号的 16 位整数。一个示例数据集是:

这归结为 6468 的答案。但在第一个等式中,我的应用程序表现得好像它至少小了 3% 或大了 3%。我这样说是因为这是一个嵌入式应用程序,除了测试它是否在某个“正常”范围内之外,我无法确认计算结果。当我使用第二个方程时,它属于参数,但使用我的“简化”(位移)方程时,它没有,所以我认为我必须错误地进行移位(或者我简化错误但我三重检查了它)。

任何见解表示赞赏,谢谢。

0 投票
5 回答
384 浏览

c - 意外的位移结果

我正在用 a = 0xff 初始化一个 unsigned short int (所有位都已设置)。然后我将 b 分配给 a>>7 ,它应该产生 (0000 0001) 并且确实如此。然而,奇怪的是,当我将 c 分配给 a<<7 时,它并不等于 (1000 0000)。我通过输出 0x80(即 1000 0000)和 c 对此进行了测试,但它们并不相同。

这是一些代码:

我不确定问题是什么。任何帮助表示赞赏。谢谢。

PS “输出”是指以十进制和十六进制形式输出 0x80 和 c。