首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从C中的数字返回多个位

如何从C中的数字返回多个位
EN

Stack Overflow用户
提问于 2015-02-08 23:54:25
回答 3查看 1.9K关注 0票数 1

我有一个函数从一个数字中提取一个位:

代码语言:javascript
复制
int getBit (int value, int position) {

    return value & (1 << position));

    }

但是如何对一个范围(包括有符号数字和无符号数字)这样做呢?例如:

从0x12345678 (签名0) = 0x15获得10:14位

代码语言:javascript
复制
int getField (int value, int hi, int lo, bool isSigned)
EN

回答 3

Stack Overflow用户

发布于 2015-02-09 00:36:14

你只需要创建一个面具:

代码语言:javascript
复制
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;
}

我还没有测试这个功能,但它只是为了解释制作面具的方法。

最后的功能可能是这样的:

代码语言:javascript
复制
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)。

我不知道你对签名人和未签名人的数字是什么意思,但我希望它能对你有所帮助。

学我的英语。

票数 0
EN

Stack Overflow用户

发布于 2015-02-09 00:45:27

我怀疑你可能想用另一种方式来处理整个问题。与其提取比特,为什么不直接使用比特掩码。

例如,要检查是否启用了字节中最重要的位:

代码语言:javascript
复制
if(byte & 0xf0) {}

要检查最不重要的位数,应该是:

代码语言:javascript
复制
if(byte & 0x01) {}

要检查多个比特(或一个“范围”),例如低阶咬取:

代码语言:javascript
复制
if(byte & 0x0f) {}

从你所说的来看,我怀疑这更接近你想要的东西,而且比转移到提取比特要简单得多。

票数 0
EN

Stack Overflow用户

发布于 2015-02-09 11:25:57

这有点有趣:)分三个简单的步骤:

  1. 将您的值按lo值右移,并使用lo降低hi。这将问题简化为“获取最低的hi位”。
  2. 剪辑最高位-一个定制的掩码是创建的动态。
  3. 如果有必要,使用最高位来签名-扩展结果(基于Sign extending from a constant bit width in C#的篡改)。

我不知道建议函数原型的原因,但我建议使用order lo, hi而不是hi, lo。不知怎么的,10,14比相反的感觉更自然,尽管当计算从左到右时,位数从高到低--计算机应该使我们的事情变得更容易!

代码语言:javascript
复制
#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;
}

结果:

代码语言:javascript
复制
i = -11 / FFFFFFF5h

哪个是正确的位集:

代码语言:javascript
复制
  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 result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28400816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档