2013-07-25 41 views
0

可以说我有一个位掩码如何通过位掩码存储和检索3位数字?

enum ExampleMask 
{  
    Attribute1 = 1 << 1, 
    Attribute2 = 1 << 2, 
    ... 
    Attribute27 = 1 << 27 
} 

所以我已经用我的32个可用位27。

我现在想要除了使用位掩码的标志之外还能够存储和检索3位无符号整数。

例如:

// Storing values 
int mask = Attribute2 | Attribute6 | Attribute18; // Saving some attributes 
int mask |= ???? // How to save the number 8? 

// Retrieving values 
if(mask & Attribute2) do something...; 
if(mask & Attribute6) do something...; 
int storedValue = ???? // How to retrieve the 8? 

基本上我想在我的位掩码保留3位保存在那里

0-8之间的数字。感谢您抽出时间来阅读和帮助。

+0

'int mask = 9'? –

+0

我需要能够正常存储标志,除了保存9 – xNidhogg

+0

9需要4位 –

回答

1

您可以将该值上移到未使用的位,例如,

要存储的值:

mask |= val << 28; 

检索值:

val = mask >> 28; 

注意mask确实应该unsigned避免换挡时的传播符号位。如果由于某种原因必须使用signed int,那么在检索val时应该添加额外的掩码操作,例如,

val = (mask >> 28) & 0x0f; 
+0

'mask '和'val'虽然被签名。他们不应该是无符号整数,以避免UB? –

+0

您还需要将类型更改为'unsigned'(或者更便携的'uint32_t')。 –

+0

我只是编辑答案,以解决问题与签署诠释 - 3位值它并不重要,但它似乎OP实际上需要4位,所以我添加了一个关于掩蔽或使用unsigned int的注释。 –