我正在阅读Stroustrup撰写的TCPPPL。它给出了一个函数示例,它提取32位长的 中间 16位,如下所示:
unsigned short middle(long a){ return (a>>8)&0xffff;}.
我的问题是:是不是提取 last 16位?告诉我,我错了。
答案 0 :(得分:6)
确实提取了中间的16位:
// a := 0b xxxx xxxx 1111 1111 1111 1111 xxxx xxxx
a>>8; // 0b 0000 0000 xxxx xxxx 1111 1111 1111 1111
&0xffff // 0b 0000 0000 0000 0000 1111 1111 1111 1111
答案 1 :(得分:3)
a >> 8
会将a
中的值右移8位。低8位被遗忘,之前编号为31-8的位现在被移动(重新编号)为23-0。最后,屏蔽掉更高的16位会留下15-0位,最初是在位置23-8之前(在移位之前)。瞧。
答案 2 :(得分:1)
a将在按位和操作之前右移8位(a>>8
)。
答案 3 :(得分:0)
您是否注意到>>8
部分?它首先将参数右移8位。