问题标签 [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.
c - 我在哪里可以找到 C 的位移指南?
我看过什么是位移(位移)运算符以及它们是如何工作的?,但我仍然觉得位移的概念很难理解。
有人可以指出我在 C 中移位的更基本指南的方向吗?我希望它会很长,因为它需要涵盖整个主题。
我正在学习C 编程语言(AKA K&R),这就是它的用途,所以我可以做练习。我了解基础知识,但我仍然无法进行正确的位移操作。
以下是让我难过的 K&R 的练习
练习 2-6:编写一个函数 setbits(x, p, n, y) 返回 x,其中从位置 p 开始的 n 位设置为 y 的最右边 n 位,其他位保持不变。
练习 2-7:编写一个函数 invert(x, p, n),它返回 x,其中从位置 p 开始的 n 位反转(即 1 变为 0,反之亦然),其他保持不变。
练习 2-8:编写一个函数 rightrot(x, n),返回整数 x 向右旋转 n 位的值
练习 2-9:在二进制补码系统中,x &= (x-1) 删除 x 中最右边的 1 位。解释原因,并使用此观察来编写更快的 bitcount 版本。
这些是 k&R(C 编程语言)书中的练习。这是最好的 C 书籍,但我无法理解位移,所以我在这些练习中遇到了问题。
c - 我可以在 C 编程中使用乘法和除法来移位吗?
代替使用>>
和<<
移位,是否可以使用*
和/
左右移位?
对于 8 位:0x01 * 2 = 0000|0010。
bit-manipulation - 您是否曾经在实际项目中不得不使用位移位?
您是否曾经在实际的编程项目中不得不使用位移位?大多数(如果不是全部)高级语言中都有移位运算符,但是你什么时候真正需要使用它们呢?
c - 为什么这种按位右移似乎不起作用?
有人可以向我解释为什么面具根本没有向右移动吗?你可以用任何东西代替那个 1 ,结果是一样的。
c# - 为什么在移位 32 位值时只使用移位操作数的低五位?(例如(UInt32)1 << 33 == 2)
考虑以下代码:
它不会产生警告(关于使用大于 32 的移位),因此它必须是预期的行为。
实际输出到生成程序集的代码(或至少 Reflector 对代码的解释)是
IL(再次,使用反射器)是
我了解发生了什么(在MSDN中有描述);编译代码时,移位 32 位值时仅使用低 5 位...我很好奇为什么会发生这种情况。
(出现的方式shift33a
也让我认为 Reflector 不太对劲,因为他们对 IL 的 c# 表示会编译成不同的东西)
问题:
- 为什么只使用“要移位的值”的低 5 位?
- 如果“移动超过 31 位没有意义”,为什么没有警告?
- 这是向后兼容的事情吗(即这是程序员“期望”发生的事情)?
- 我是否正确,底层 IL 可以进行超过 31 位的移位(如
L_0010: ldc.i4.s 0x21
),但编译器正在修整这些值?
c# - 左位移 255(作为一个字节)
谁能解释为什么以下内容无法编译?
错误:
常量值“510”不能转换为“字节”
我期待以下二进制文件:
类型转换难倒了我。
c# - 是否有任何 C# 位移位运算符将溢出的位移动到变量的另一端?
我们称之为“<<<”
等于
(假设 << 和 >> 丢弃溢出的位)
有这样的运营商吗?
c++ - 零位移位会正常工作吗?
假设我有这样的功能:
每次从不同站点调用它bitCount
都是非负的,并且在int
. 我特别关心bitCount
等于零的呼叫 - 那么它会正常工作吗?
编译器在编译其调用站点时看到函数的整个代码是否有可能将bitCount
等于零的调用减少为无操作?
c# - C# 中的位移混淆
我有一些像这样的旧代码:
它很长,我想我可以像这样修剪它:
但是,我没有得到与第一个函数相同的值。该字节包含 00000000 或 10000000。我在这里缺少什么?我是否使用了不正确的运算符?