36得票6回答
需要帮助理解K&R C语言第二章中的"getbits()"方法。

在第二章中,关于位运算符的部分(第2.9节),我不太理解其中一个示例方法是如何工作的。 以下是提供的方法:unsigned int getbits(unsigned int x, int p, int n) { return (x >> (p + 1 - n)) &amp...

35得票8回答
n是负数、正数还是零?返回1、2或4。

我正在构建一个PowerPC解释器,它工作得非常好。在Power架构中,条件寄存器CR0(在x86上的EFLAGS)在几乎所有指令中都会更新。它的设置方式如下:如果上次操作结果为负,则CR0的值为1;如果上次操作结果为正,则其值为2;否则为4。我最初的天真方法是:if (n < 0) ...

35得票1回答
Java中的无符号右移位运算符 '>>>' 的含义

可能是重复问题: 为什么(-1 >>> 32) = -1? 无符号右移运算符在最左边插入一个0。因此当我执行System.out.println(Integer.toBinaryString(-1>>>30)) 输出11 因此,在最左边的位...

34得票1回答
为什么在C++14中1 << 31被改为实现定义?

在2014年之前的所有C和C++版本中,写下以下代码:1 &lt;&lt; (CHAR_BIT * sizeof(int) - 1) 由于左移被定义为相当于连续乘以2,因此这种移位导致了未定义的行为,因为它导致了有符号整数溢出: E1 &lt;&lt; E2 的结果是 E1 左移 E2...

34得票2回答
Rust的位移运算符具体语义是什么?

我试图找到关于整数上的 &lt;&lt; 和 &gt;&gt; 操作符是如何工作的确切信息,但我没有找到清晰的答案(文档在这方面并不是很好)。 有两个语义部分对我来说不太清楚。首先,“移入”的是哪些位? 从一侧移入零(即 0b1110_1010u8 &lt;&lt; 4 == 0b10...

32得票5回答
在C语言中声明64位变量

我有一个问题。uint64_t var = 1; // this is 000000...00001 right? 在我的代码中,这个可以工作:var ^ (1 &lt;&lt; 43) 但是它如何知道1应该在64位中呢?我不应该写成这样吗?var ^ ( (uint64_t) 1 &lt;&...

32得票2回答
算术右移会产生错误的结果吗?

我一定是疯了,但是我机器上的gcc 4.7.3却给出了荒谬的结果。以下是我正在测试的精确代码:#include &lt;iostream&gt; using namespace std; int main(){ unsigned int b = 100000; cout &lt;&...

31得票5回答
右移和有符号整数

在我的编译器上,以下伪代码(值替换为二进制):sint32 word = (10000000 00000000 00000000 00000000); word &gt;&gt;= 16; 生成一个带有比特域的 word:(11111111 11111111 10000000 00000000...

31得票6回答
x86中的旋转指令(ROL,RCL)有什么作用?

我一直想知道一些CPU上具有旋转指令(例如x86上的ROL、RCL)的目的是什么。有哪些软件会使用这些指令呢? 起初,我认为它们可能用于加密/计算哈希代码,但这些库通常是用C编写的,而C没有将运算符映射到这些指令中。(编辑说明:请参见C++中循环移位(旋转)操作的最佳实践,了解如何编写可编译为...

30得票4回答
何时在C#中使用位移运算符<< >>?

我正在学习C#中的位移运算符,试图找出在我的代码中什么时候可以使用它们。 我找到了一个Java的答案,你可以: a) 使整数乘法和除法操作更快: *4839534 * 4*可以这样完成: 4839534 &lt;&lt; 2 或者 543894 / 2可以这样完成:...