在C++中将位打包到整数中

3
我想将一个整数的最低两个字节打包到另一个整数中,但目前卡住了。
for ( int i = 0; i < 8 ; i ++){
         if ((bitmask & ( 1 << i)))
             result |= 1 >> i;
     }

x = (y & 0xFFFF) + (x & ~0xFFFF); x =(y&0xFFFF)+(x&〜0xFFFF); - Borgleader
1
@Borgleader 最低的2个字节,而不是最低的2个位。 - PeterT
@PeterT 噢,我误读了。不过为自己辩护一下,这个想法是一样的,只是掩码不同。 - Borgleader
http://stackoverflow.com/help/accepted-answer - phuclv
2个回答

4

与字节序无关的解决方案:

x = ((y >> 0) & 0xFF) |
    ((y >> 8) & 0xFF);

为什么?他在两种情况下都使用整数类型,因此不可能存在字节序问题。 - James Kanze
2
@JamesKanze 我的意思是,像 uint8_t* ptr = (uint8_t*)&the_int; x = *ptr; ptr++; x |= *ptr; 这样的其他解决方案会受到大小端的影响,因为你不知道 ptr 是否会给你最高位字节或最低位字节。如果你通过将1个 uint32_t 和 4个 uint8_t 组成一个联合来解决问题,那么同样存在这个问题。 - Lundin
@Lundin 针对什么提供了端无关的解决方案?我只看到y的最低两个字节被压缩在一起并赋值给x。 - Orwellophile
1
@Orwellophile 就像使用指针算术或联合等解决方案不同,y 的字节序并不重要。 - Lundin
@Lundin 确实,字节序不会影响结果,但这是因为您使用按位或将两个最低字节压缩成一个字节。它也没有做任何有用的事情,甚至在任何字节序格式中都无法逆转。 - Orwellophile

1
如果我理解你的意思正确,那么足够的解决方案应该是这样的:
another_integer = first_integer & 0xFFFF // which is 65536, which is 2^16 so 0000000011111111 binary (for 4 byte integer)

那么,您可以通过使用简单的AND掩码将第一个整数的两个较低字节的值分配给另一个整数。
0101110011101010
0000000011111111 AND
----------------
0000000011101010

是的,十进制数更难读出位。如果我看到 0xF0F0,我知道只需看它就有4个交替开关的位,但用61680试试看。 - PeterT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接