首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C/C++表示扩展数字的最佳方式是什么?

用C/C++表示扩展数字的最佳方式是什么?
EN

Stack Overflow用户
提问于 2019-03-15 20:19:30
回答 2查看 2.2K关注 0票数 3

我有10位有符号的值。它实际上是一个10位的颜色值,我想要转换成一个int

这10位将被解释为更大的int中的一个有符号值,其中其他位为零。

我可以想到三种方法,如下所示:

代码语言:javascript
复制
#include <stdio.h>

void p(int v)
{
    printf("\t%d", v);
}

int main()
{
    for (int i = -2; i < 3; ++i)
    {
        unsigned int u = i & 0x3ff;

        int v;

        // method 1: test the bit
        v = u;
        if (u & 0x200) v = v ^ -0x400;
        p(v);

        // method 2: shift
        v = u<<(sizeof(int)*8-10);
        v >>= (sizeof(int)*8-10);
        p(v);

        // method 3: use sign extend
        v = (signed char)(u >> 2);
        v <<= 2;
        v |= u;
        p(v);


        printf("\n");

    }

    return 0;
}

有更好的办法吗?经常会出现这样的问题。

谢谢你的意见。

更新

增加两种方法。@cruz-jean提出的第一种是位字段,第二种是gcc在编译比特字段后提出的。

代码语言:javascript
复制
      // method 4: bit fields
        struct { int v:10; } f;
        f.v = u;
        v = f.v;

        // method 5: sign extend short
        v = (signed short)(u << 6);
        v >>= 6;

出于兴趣,MSVC将#4编译为#2,gcc将#4编译为#5。

方法5看起来不错。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-15 20:32:47

您可以声明一个10位签名的位域助手类型,并以int的形式访问该值。

代码语言:javascript
复制
struct signed_10_bit
{
    int val : 10;
};

int some_10_bit_num = 0x3ff;
int extended = signed_10_bit{ some_10_bit_num }.val;
票数 3
EN

Stack Overflow用户

发布于 2019-03-16 20:48:41

另一个要尝试的:

代码语言:javascript
复制
v = u | (0 - (u&0x200));

对于转换速度慢的cpus来说很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55190111

复制
相关文章

相似问题

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