c++ - 难以理解 C++ 程序、shift 和 &

标签 c++ shift

在我的机器语言类(class)中,我们必须将 c++ 翻译成 mips,问题是我对 c++ 了解不多,只是一些基本知识,所以我很难理解这个函数:

void IPtoDD(int arg0, char *arg1)
{
  int temp, numChar, shift = 24;

  for (int i=0; i<4; i++) {
    temp = arg0 >> shift;
    temp = temp & 0x000000ff;
    numChar = byteToDec(temp,arg1);
    arg1 += numChar;
    *arg1++ = '.';
    shift -= 8;
  }

特别是

    temp = arg0 >> shift;
    temp = temp & 0x000000ff;

最佳答案

>>> 运算符是“右移运算符”。它将左边值的二进制表示向右移动 x 位,其中 x 是右边的数字。这看起来像什么?以下是一些示例:

decimal: 128                   >> 1 == 64
binary:  0b0000 0000 1000 0000 >> 1 == 0b0000 0000 0100 0000

decimal: 64                    >> 1 == 32
binary:  0b0000 0000 0100 0000 >> 1 == 0b0000 0000 0010 0000

注意大二进制数中的 1 如何右移 1。在您的代码中,您将 arg0 移动 shift,其中 arg0 是一些输入,shift 是 24、16、8,然后是 0,因为你在循环。这意味着第一个循环,您将 arg0 向下移动 24 位,然后将其存储到 temp 中。

第二个语句是按位与,它将左侧的每一位与右侧的每一位进行比较。如果两个位都为 1,则相同位置的结果位为 1,否则为 0。下面是一些示例:

decimal: 7      & 15     == 7
binary:  0b0111 & 0b1111 == 0b0111

decimal: 5      & 12     == 4
binary:  0b0101 & 0b1100 == 0b0100

在您的表达式中,AND 是用右侧值 0x000000FF 完成的,它是 255 的十六进制等效值(十进制)。

您感兴趣的两个语句正在做的是从输入 arg0 中提取每个“字节”或“8 位 block ”:

temp = arg0 >> shift;
temp = temp & 0x000000ff;

Input:  arg0 = 0x12345678, shift = 24
Output: temp = 0x12

Input:  arg0 = 0x12345678, shift = 0
Output: temp = 0x78

关于右移的附录:

您正在将一个有符号整数移到此处,但幸运的是您使用以下 AND 掩码屏蔽了这些位。为了完整起见,在有符号整数上右移可以做以下两件事之一(假设这里是 16 位数字,结果对于 32 位或 64 位数字会有所不同):

算术右移:

decimal: -128                  >> 1 == -64
binary:  0b1111 1111 1000 0000 >> 1 == 0b1111 1111 1100 0000

逻辑右移:

decimal: -128                  >> 1 == 32704
binary:  0b1111 1111 1000 0000 >> 1 == 0b0111 1111 1100 0000

请注意算术右移如何“复制”最高位,其中“逻辑右移”带来了零。它是 平台 特定于如何实际解释它的,因此请尽可能远离它,并坚持移动无符号整数。

关于c++ - 难以理解 C++ 程序、shift 和 &,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304229/

相关文章:

C++ 宏,将 n 扩展为 1, 2, 3, ... n

c++ - 两阶段函数模板编译 : not *only* ADL is employed in the 2nd phase?

java - 您如何确定字符是否需要按下 Shift 键才能键入?

ios - 按位右移 >> 在 Objective-C 中

德尔福。如何使用 TreeView 移动框架?

c++ - 引用使用 Union

c++ - 使用 -O3 优化和奇数间距填充 16bpp 图像时崩溃

c++ - 增加线程数,但程序无法更快地运行 C++ OpenMP 选择排序

java - 单击actionPerformed(Java Swing)上的按钮时如何识别是否选择了shift?

javascript - 不工作 : <form onsubmit ="alert(event.shiftKey)"> on Javascript