如何使用位操作在一个整数中编码和解码两个数字?
我正在学习位操作,然后我想到了这一点。假设我有两个数字,第一个在[1,6]的范围内,第二个在[0,3]的范围内。现在第一个数字可以存储最多3位数据,第二个数据可以存储2位数据。我怎样才能使用一个int32来存储它们。谢谢。如何使用位操作在一个整数中编码和解码两个数字?
会做到这一点。
second_number
然后占用两个最低有效位,你可以用composite & 3
提取它。
first_number
占据了三位,即“左”,你可以用composite >> 2
提取它。
感谢您的回答。可以编码两个以上的数字吗? –
当然可以。您只需使用更多的按位运算符进行提取。 @nglee的答案更容易概括。 – Bathsheba
编码:
// a : range of [1,6], bit0 ~ bit2
// b : range of [0,3], bit3 ~ bit4
// c : encoded int32
c = 0;
c |= (a | b << 3);
解码:
a = (c & 0x00000007);
b = (c & 0x00000018) >> 3;
如果你只需要打包成一个INT两个数字,而不是位操作你可能想使用bit fields。这样你就可以在一个int字段的空间中存储两个字段并通过名称访问它们。
我想通过网络发送数据,它必须是int。我在这里有一些限制。谢谢。 –
@Ankitsinghkushwah它可以采取完全大小的int值存储,只是要小心签署/无符号。你可以在这里检查它:http://cpp.sh/6q73k也许它会帮助你另一次:) – Michael232
请注意,位域的布局是特定于实现的。不要求包含两个小字段的结构必须适合'int'。这通常是完成的,但不能保证。 –
您也可能有兴趣看[bit feilds](http://en.cppreference.com/w/cpp/language/bit_field) – NathanOliver