问题标签 [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 投票
6 回答
624 浏览

c++ - What is the << operator doing in C++?

In the example below, what exactally is the << operator doing? I'm guessing it is not a bitwise operator.

I understand what the code will do here: Use standard out, send this text, send an end of line. Just I've never come accross the use of this << apart from on raw binary.

I'm starting out with C++. And, as an operator of sorts, it's hard to search for a description of this and what it means. Can someone enlighten me and/or give me a pointer as to what to google for?

Thanks Ross

0 投票
7 回答
4244 浏览

c++ - 右移运算符的奇怪行为 (1 >> 32)

我最近使用右移运算符遇到了一个奇怪的行为。

以下程序:

输出:

函数会发生什么foo()?我知道它所做的与最后两行之间的唯一区别是最后两行是在编译时评估的。如果我使用 64 位整数,为什么它会“工作”?

任何有关此的灯将不胜感激!


当然相关,这就是g++给出的:

0 投票
2 回答
1936 浏览

assembly - 在 asm 中左移然后立即右移?

免责声明:我是 asm 新手。我可能需要复习我的 2s 补码或其他东西才能完全理解 :(

我对以下目的感到困惑:

为什么要转回来?和movs?

0 投票
2 回答
4186 浏览

.net - 关于在 .Net 中转换浮点数据类型的细节?

如果我没记错的话,双精度或浮点数分为 3 个部分:符号位、指数和尾数。

当双精度移位时,位是移位变量的整个二进制还是只移位尾数?

0 投票
3 回答
1466 浏览

c - 我不明白以下 C 代码行

我找到了以下线程:
从 ip 和子网掩码计算广播地址以及指向http://lpccomp.bc.ca/netmask/netmask.c的链接

有人可以解释以下行,我不明白:

尤其mask & (1L<<(32-maskbits))

0 投票
3 回答
4129 浏览

c - 如何在 C 中移出位?

我正在尝试用 C 语言编写一个函数,该函数将根据时钟信号移出字节的各个位。到目前为止,我已经想出了这个......

其中 DataPin 代表我想要将数据移出的端口引脚,ClkPin 是时钟端口引脚。

我希望设备从字节的 LSB 开始移出 8 位。出于某种原因,我的输出引脚一直保持高电平。我确信端口引脚配置正确,所以这纯粹是一个逻辑问题。

0 投票
4 回答
5287 浏览

bit-manipulation - 除了快速数学之外,还有什么好的理由使用位移?

我了解按位运算以及它们如何用于不同的目的,例如权限。但是,我似乎不明白位移运算符的用途。我理解它们是如何工作的,但我想不出任何我想使用它们的场景,除非我想做一些非常快速的乘法或除法。还有其他使用位移的原因吗?

0 投票
1 回答
8744 浏览

c - 逻辑、算术位移

寻求澄清一些事情。

据我了解,关于算术、逻辑位移:

  1. <<两者都一样
  2. >>移位的不同之处在于逻辑移位将始终用 0 填充字节,而算术移位将用符号位填充它。

如何使用 C 区分这一点?

据我了解,实际操作员是相同的<<>>

命令在以下方面有何不同:

请告诉我,

0 投票
9 回答
6192 浏览

c++ - 在 AVR 中,逻辑右移 2 的幂是否更快?

我想知道按 2 的幂移动时执行逻辑右移是否更快

例如,是

任何快于

我很感激每个人的第一反应是告诉我,人们不应该担心这样的小事情,它使用正确的算法和集合来减少数量级的重要性。我完全同意你的观点,但我真的想尽我所能从嵌入式芯片(ATMega328)中挤出来——我刚刚获得了值得“哇哦!”的性能转变。通过用位移来代替除法,所以我向你保证,这确实很重要。

0 投票
8 回答
20653 浏览

c++ - 为什么当左侧操作数为负值时,左移操作会调用未定义行为?

在 C 中,当左侧操作数为负值时,按位左移操作调用未定义行为。

来自 ISO C99 (6.5.7/4) 的相关引用

E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2 E2,以比结果类型中可表示的最大值多一个模数减少。如果 E1 有带符号类型和非负值,并且 E1 × 2 E2在结果类型中是可表示的,那么这就是结果值;否则,行为未定义

但是在 C++ 中,行为是明确定义的。

ISO C++-03 (5.8/2)

E1 << E2 的值是 E1(解释为位模式)左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值是 E1 乘以 2 的 E2 次幂,如果 E1 具有无符号长类型,则以模 ULONG_MAX+1 减少,否则为 UINT_MAX+1。[注意:常量 ULONG_MAX 和 UINT_MAX 在标题中定义)。]

这意味着

在 C 中调用未定义的行为,但该行为在 C++ 中定义良好。

是什么迫使 ISO C++ 委员会认为这种行为与 C 中的行为相反?

另一方面,implementation defined当左操作数为负时,行为是按位右移操作,对吗?

我的问题是为什么左移操作会调用 C 中的未定义行为,为什么右移运算符只调用实现定义的行为?

PS:请不要给出“这是未定义的行为,因为标准是这样说的”这样的答案。:P