该>>
运算符是“右移运算符”。它将左侧值的二进制表示向右移动 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.txt 中。
第二个语句是按位与,它将左侧的每个位与右侧的每个相应位进行比较。如果两个位都为 1,则相同位置的结果位为 1,否则为 0。以下是一些示例:
decimal: 7 & 15 == 7
binary: 0b0111 & 0b1111 == 0b0111
decimal: 5 & 12 == 4
binary: 0b0101 & 0b1100 == 0b0100
在您的表达式中,AND 使用右手边的值完成,该值0x000000FF
是 255 的十六进制等效值,以十进制表示。
您感兴趣的两个陈述正在做的是从输入中提取每个“字节”或“8位块” arg0
:
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
请注意算术右移如何“复制”最高位,其中“逻辑右移”引入了零。它是如何实际解释的特定于平台的,所以如果可能的话尽量远离它,并坚持移动无符号整数。