问题标签 [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 回答
16375 浏览

javascript - javascript中的位移

我有一个非常大的数字:5799218898。并且想将其右移到 13 位。
所以,windows-calculator 或 python 给了我:

正如预期的那样。

但是Javascript:

我认为这是因为 javascript 中的内部整数表示,但找不到任何相关信息。

0 投票
2 回答
3935 浏览

java - 如何从 Java 中的字节数组中解析位字段?

我被赋予了一项艰巨的任务,将一些来自源的传入 UDP 数据包解析为适当的 Java 表示。踢球者是数据包中保存的数据不是字节对齐的。为了使协议尽可能紧凑,有许多位字段指示数据字段的存在或不存在。

例如,在位索引 34 处,您可能会发现应转换为浮点数的 24 位字段。位索引110可以是指示接下来的3个字段分别是包含一天中的小时、分钟和秒的5位和6位值的标志。(这些只是由我编造的,但代表了规范所说的内容)。这些数据包可能有几百位长。

规范不太可能改变,但完全有可能要求我解码其他类似的数据包格式。

我当然可以根据需要进行位移和掩码,但我担心最终会陷入位移地狱,然后在发现更多数据包格式时淹没其中。

我很想听听关于最佳实践或 Java 库的任何建议,这些建议可能会使任务更易于管理。

0 投票
4 回答
1383 浏览

c++ - C++ 移位

我是移位新手,但我正在尝试调试以下代码段:

我收到一条警告,说“32”到“56”的行的班次计数太大。谓词中的“f64”只是表示数据应该是64位数据。

这应该怎么做?

编辑:

我应该把更多的代码放进去。

{ dem_content_buff[BytFldPos] = tmp_data; dem_content_buff[BytFldPos + 1] = tmp_data >> 8; dem_content_buff[BytFldPos + 2] = tmp_data >> 16; dem_content_buff[BytFldPos + 3] = tmp_data >> 24;
}

if (!(strcmp(dems[i].GetValType(), "f64"))) { dem_content_buff[BytFldPos] = tmp_data; dem_content_buff[BytFldPos + 1] = tmp_data >> 8; dem_content_buff[BytFldPos + 2] = tmp_data >> 16; dem_content_buff[BytFldPos + 3] = tmp_data >> 24; dem_content_buff[BytFldPos + 4] = tmp_data >> 32; dem_content_buff[BytFldPos + 5] = tmp_data >> 40; dem_content_buff[BytFldPos + 6] = tmp_data >> 48; dem_content_buff[BytFldPos + 7] = tmp_data >> 56; }

所以,dem_content_buff现在只保存整数。我也不能将此数组用于 64 位数据吗?

0 投票
1 回答
4388 浏览

c++ - 如何制作 64 位掩码?

基于以下简单程序,按位左移运算符仅适用于 32 位。这是真的吗?

程序的输出:

如何制作 64 位掩码?

0 投票
15 回答
6132 浏览

c# - C# 中的两个左尖括号“<<”是什么意思?

基本上是标题中的问题。我正在查看 MVC 2 源代码:

我只是好奇双左尖括号的<<作用。

0 投票
1 回答
1993 浏览

java - Java >> 和 >>> 右移运算符之间的性能有何不同?

有没有理由认为 Java 中的 >>(有符号)和 >>>(无符号)右位移运算符会执行不同的操作?我无法在我的机器上检测到任何差异。

这纯粹是一个学术问题;我敢肯定,它永远不会成为瓶颈。我知道:最好把你最想说的写出来;例如,使用 >> 除以 2。

我认为归结为哪些架构将哪些操作作为指令实现。

0 投票
6 回答
17978 浏览

c++ - C++ 中的移位运算符

如果移位运算符后的值大于左侧操作数的位数,则结果未定义。如果左侧操作数是无符号的,则右移是逻辑移位,因此高位将用零填充。如果左侧操作数有符号,则右移可能是也可能不是逻辑移位(即行为未定义)。

有人可以解释一下上述几行的含义吗?

0 投票
8 回答
5594 浏览

php - PHP等效的javascript >>>用零填充位运算符右移?

我可以知道我该怎么做 PHP >>> 吗?此类运算符在 PHP 中不可用,但在 Javascript 中可用。

我刚刚设法发现了一个功能如下:

但不幸的是,它不能完美地工作。

EG:-1149025787 >>> 0 Javascript 返回 3145941509 PHP zeroFill() 返回 0

0 投票
2 回答
4622 浏览

java - 负逻辑移位

在Java中,为什么 -32 >>> -1 = 1 ?
它不仅限于-32。只要它们不是太大,它就适用于所有负数。
我发现
x >>> -1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4 = 15
给定 0 > x > 一些大的负数

>>> -1 和 << 1 不一样吗?但是-32 << 1 = -64。
我已经阅读了二的补码,但仍然不明白其中的原因。

0 投票
3 回答
10262 浏览

c - 有效地对 int 数组进行移位?

为了在同一页面上,我们假设 sizeof(int)=4 和 sizeof(long)=8。

给定一个整数数组,在逻辑上向左或向右移位数组的有效方法是什么?

我正在考虑一个辅助变量,例如 long,它将计算第一对元素(索引 0 和 1)的位移并设置第一个元素 (0)。以这种方式继续,元素(索引 1 和 2)的位移将是计算机,然后将设置索引 1。

我认为这实际上是一种相当有效的方法,但也有缺点。我不能位移大于 32 位。我认为使用多个辅助变量会起作用,但我正在设想沿线某处的递归。