2017-06-20 55 views
1

我正在学习位操作,然后我想到了这一点。假设我有两个数字,第一个在[1,6]的范围内,第二个在[0,3]的范围内。现在第一个数字可以存储最多3位数据,第二个数据可以存储2位数据。我怎样才能使用一个int32来存储它们。谢谢。如何使用位操作在一个整数中编码和解码两个数字?

+0

您也可能有兴趣看[bit feilds](http://en.cppreference.com/w/cpp/language/bit_field) – NathanOliver

回答

2

会做到这一点。

second_number然后占用两个最低有效位,你可以用composite & 3提取它。

first_number占据了三位,即“左”,你可以用composite >> 2提取它。

+0

感谢您的回答。可以编码两个以上的数字吗? –

+1

当然可以。您只需使用更多的按位运算符进行提取。 @nglee的答案更容易概括。 – Bathsheba

6

编码:

// 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; 
+0

有一个upvote:你的代码比我的更专业,特别是'a | b << 3'这是您的运营商优先级知识的试金石。 – Bathsheba

+0

@Bathsheba谢谢,但我喜欢你的乘法和除法的想法。 (猜猜它现在被编辑了)它看起来比这个更简单。 – nglee

+0

这就是我的想法,但我认为使用按位运算符有点不特别。您已经注意记录它,您的答案仍然优越。 (有趣的是,我们如何把这两个数字放在不同的地方,那么Endianness战斗是如何开始的?) – Bathsheba

2

如果你只需要打包成一个INT两个数字,而不是位操作你可能想使用bit fields。这样你就可以在一个int字段的空间中存储两个字段并通过名称访问它们。

+0

我想通过网络发送数据,它必须是int。我在这里有一些限制。谢谢。 –

+1

@Ankitsinghkushwah它可以采取完全大小的int值存储,只是要小心签署/无符号。你可以在这里检查它:http://cpp.sh/6q73k也许它会帮助你另一次:) – Michael232

+0

请注意,位域的布局是特定于实现的。不要求包含两个小字段的结构必须适合'int'。这通常是完成的,但不能保证。 –

相关问题