将位数组转换为短数组

Posted

技术标签:

【中文标题】将位数组转换为短数组【英文标题】:Convert bit array to short 【发布时间】:2013-12-06 22:35:31 【问题描述】:

我有一个返回短片位的函数(灵感来自Converting integer to a bit representation):

bool* bitsToShort(short value) 
    bool* bits = new bool[15];
    int count = 0;
    while(value) 
        if (value&1)
            bits[count] = 1;
        else
            bits[count] = 0;
        value>>=1;
        count++;
    
    return bits;

我该如何做相反的事情?转换short中的位数组?

【问题讨论】:

带有一些位/位运算符。不确定是否有更好的方法/stdfunction 具有 15 位短裤的实现不符合 C 或 C++ 语言定义。即使它更改为 16,在不检查溢出的情况下做出这样的假设也是一个糟糕的假设。当然,这与问题无关。 <g> @PeteBecker short 具有 15 个值位和一个符号位的实现确实符合,并且代码已经没有正确处理负值(也许它不需要)其他原因,所以如果你忽略符号位,剩下 15 位。 @hvd - 好点。那么,假设是 value 是非负的并且小于 2^16。 @PeteBecker 对,我可以看到我的评论不是很清楚,但你明白我的意思。 【参考方案1】:
short shortFromBits(bool* bits) 
    short res = 0;
    for (int i = 0; i < 15; ++i) 
        if (bits[i]) 
            res |= 1 << i;
        
    
    return res;

res |= (1&lt;&lt;i)res 中的第 i 位设置为 1。

【讨论】:

谢谢,我会接受答案,但还有一个问题:为什么 40000 不起作用?把 7232 还给我。 因为 40000 比 short 大。 (40000 & 0x7FFF) == 7232。【参考方案2】:

像这样:

bool* bits = ... // some bits here
short res = 0;
for (int i = 14 ; i >= 0 ; i--) 
    res <<= 1;             // Shift left unconditionally
    if (bits[i]) res |= 1; // OR in a 1 into LSB when bits[i] is set

return res;

【讨论】:

在给出的代码中,bits[0] 是 LSB;在您的代码中, bits[0] 将是 MSB。投反对票(对此感到抱歉)。【参考方案3】:

基本上:

unsigned short value = 0;
for (int i = sizeof(unsigned short) * CHAR_BIT - 1; 0 <= i; --i) 
    value *= 2;
    if (bits[i)
        ++value;

这假设bits 指向一个至少包含sizeof(unsigned short) 元素的bool 数组。我没有测试过它。某处可能存在一个错误。但也许不是。

【讨论】:

以上是关于将位数组转换为短数组的主要内容,如果未能解决你的问题,请参考以下文章

将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针

Javascript - 将整数转换为位数组

在C中将大十进制输入转换为256位数组中的十六进制输出

js将一位数组分割成每三个一组

将 n 位从 8 位数组复制到 64 位整数?

php 二位数组排序通用方法