将三个8位整数连接到C中的一个16位整数

时间:2017-06-28 11:37:21

标签: c bit-manipulation bitwise-operators

我有三个整数,一个整数包含7位数据,另一个整数包含4位数据,第三个整数包含5位数据。

我希望将所有三个整数并排连接成一个16位整数,而不更改每个整数的值。

示例:

int a = 1; //7 bit data (uint8)
int b = 2; //4 bit data (uint8)
int c = 3; //5bit data (uint8)

其中, 0< a< 100,0< b< 13,0< c< 32 结果应如下:

result = 123;

示例2:

int a = 99; //7 bit data (uint8)
int b = 12; //4 bit data (uint8)
int c = 31; //5bit data (uint8)

result = 991231; //expected

如何使用位智能运算符实现这一目标?

1 个答案:

答案 0 :(得分:1)

如下所示?您可以将其修改为适用于三个整数和所需大小。

unsigned concatenate(unsigned x, unsigned y) {
    unsigned pow = 10;
    while(y >= pow)
        pow *= 10;
    return x * pow + y;        
}
 int main(){

    int a=1,b=2,c=3;
    printf("%d\n", concatenate(concatenate(a,b),c));
 }

信用到:How to concatenate two integers in C

如果你觉得自己很勇敢并且使用c++,你可以扩展它以便使用可变数量的参数。

template <typename T>
inline T concatenate(T N){
     return N;
}
template <typename T,typename...NS>
T concatenate(const T N, NS&&... ns){
    const T rest = concatenate(std::forward<NS>(ns)...);
    unsigned pow = 10;
    while(rest >= pow)
        pow *= 10;
    return N * pow + rest;      
}

int main()
{
    int a=1,b=2,c=3;
    printf("%d\n", concatenate(a,b,c,987,a));
}