提取32位长的中间16位

时间:2018-05-25 07:40:03

标签: c++ bit-manipulation

我正在阅读Stroustrup撰写的TCPPPL。它给出了一个函数示例,它提取32位长的 中间 16位,如下所示:

unsigned short middle(long a){ return (a>>8)&0xffff;}.

我的问题是:是不是提取 last 16位?告诉我,我错了。

4 个答案:

答案 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位。