我有一个函数从一个数字中提取一个位:
int getBit (int value, int position) {
return value & (1 << position));
}但是如何对一个范围(包括有符号数字和无符号数字)这样做呢?例如:
从0x12345678 (签名0) = 0x15获得10:14位
int getField (int value, int hi, int lo, bool isSigned)发布于 2015-02-09 00:36:14
你只需要创建一个面具:
int createMask(int a, int b){
int c = a;
int mask = 0;
/*First we set the lenght of the mask*/
while(c <= b){ /*Including b*/
mask <<= 1;
mask = mask|1;
c++;
}
/*Then we set the position to the mask, the first bit is in the position 0*/
c=0;
while(c<a){
c++;
mask <<= 1 ;
}
return mask;
}我还没有测试这个功能,但它只是为了解释制作面具的方法。
最后的功能可能是这样的:
int getBits(int value, int a, int b){
int mask = createMask(a, b);
mask &= value;
//Now we have to move the bits to the right
while(a>0){
mask >>= 1;
a--;
}
return mask;
}举个例子,如果你想要前6位,你必须编码: getBits(myValue,0,5)。
我不知道你对签名人和未签名人的数字是什么意思,但我希望它能对你有所帮助。
学我的英语。
发布于 2015-02-09 00:45:27
我怀疑你可能想用另一种方式来处理整个问题。与其提取比特,为什么不直接使用比特掩码。
例如,要检查是否启用了字节中最重要的位:
if(byte & 0xf0) {}要检查最不重要的位数,应该是:
if(byte & 0x01) {}要检查多个比特(或一个“范围”),例如低阶咬取:
if(byte & 0x0f) {}从你所说的来看,我怀疑这更接近你想要的东西,而且比转移到提取比特要简单得多。
发布于 2015-02-09 11:25:57
这有点有趣:)分三个简单的步骤:
lo值右移,并使用lo降低hi。这将问题简化为“获取最低的hi位”。我不知道建议函数原型的原因,但我建议使用order lo, hi而不是hi, lo。不知怎么的,10,14比相反的感觉更自然,尽管当计算从左到右时,位数从高到低--计算机应该使我们的事情变得更容易!
#include <stdio.h>
#include <stdbool.h>
int getField (int value, int hi, int lo, bool isSigned)
{
/* step 1: clip off lower bits */
value >>= lo;
hi -= lo-1;
/* step 2: clip off higher bits */
value &= ~(-1<<hi);
/* step 3: extend sign */
if (isSigned && (value & (1<<(hi-1))))
value |= -(1<<hi);
return value;
}
int main (void)
{
int i;
i = getField (0x123456c8, 14,10, true);
printf ("i = %d / %Xh\n", i,i);
return 0;
}结果:
i = -11 / FFFFFFF5h哪个是正确的位集:
16 12 8 4 0 <- bit position
...4 5 6 7 8 <- value
0100 0101 0110 0111 1000 <- bitwise
--- -- <- mask
101 01 <- result
..111101 01 < sign extended resulthttps://stackoverflow.com/questions/28400816
复制相似问题