将位数组转换为短数组
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<<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
数组。我没有测试过它。某处可能存在一个错误。但也许不是。
【讨论】:
以上是关于将位数组转换为短数组的主要内容,如果未能解决你的问题,请参考以下文章