从布尔数组中获取(各种大小)的整数

时间:2013-05-28 14:38:01

标签: math pointers casting bit-fields

好的,我说我有一个名为bits的布尔数组,以及一个名为cursor

的int

我知道我可以使用bits[cursor]来访问各个位,并且我可以使用位逻辑从bits获取更大的数据类型,例如:

short result = (bits[cursor] << 3) |
    (bits[cursor+1] << 2) | 
    (bits[cursor+2] << 1) |
     bits[cursor+3];

这会在读取更大的类型(如int32和int64)时产生行和行代码。

是否可以进行某种演员表并获得相同的结果?在这种情况下我根本不关心安全性(这些函数将被包装到一个处理它的类中)

说我希望从uint64_t中获取bits,从cursor指定的任意地址开始,cursor不一定是64的倍数;演员有可能吗?我想这个

uint64_t result = (uint64_t *)(bits + cursor)[0];

会工作,但它不想编译。

抱歉,我知道这是一个愚蠢的问题,我对指针数学很缺乏经验。我不只是寻找一个简短的解决方案,如果有人愿意的话,我也在寻找语法的细分。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的操作并将结果转换为目标数据大小。

uint64_t bitsToUint64(bool *bits, unsigned int bitCount)
{
    uint64_t result = 0;
    uint64_t tempBits = 0;
    if(bitCount > 0 && bitCount <= 64)
    {
        for(unsigned int i = 0, j = bitCount - 1; i < bitCount; i++, j--)
        {
            tempBits = (bits[i])?1:0;
            result |= (tempBits << j);
        }
    }
    return result;
}