我有几个方程式将返回我的数字中三位中的每一位的二进制值。
我正在使用C编程,这对我来说是一种新语言。
我们假设我的等式返回Y0 = 1
,Y1 = 0
和Y2 = 1
(101
);我想将该值存储为5
。
如果这些值由不同的方程式返回,那么这在C中是否可行?
我知道如何通过乘法来做到这一点,但我正在寻找一个我想象已经内置于C中的函数或其他东西。
答案 0 :(得分:5)
没有这样的运气。你必须乘以(或移位,这是相同的)
unsigned Y0 = 1, Y1 = 0, Y2 = 1, val;
val = (Y0 * 4) + (Y1 * 2) + (Y2 * 1); /* parens */
val = (Y0 << 2) + (Y1 << 1) + (Y2 << 0); /* redundant */
答案 1 :(得分:4)
Just bitshift:
Y0 | (Y1 << 1) | (Y2 << 2)
答案 2 :(得分:4)
C标准库中没有这样的功能。
你需要这样做:
int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0);
答案 3 :(得分:1)
虽然不是很受欢迎,但您确实有另一种选择,因为您可以使用位字段来执行您正在谈论的操作类型。因此,在ideone上,以下代码将执行您建议的操作。
union combine {
struct bits{
int x: 1;
int y: 1;
int z: 1;
int pad : 29;
} bitvalues;
int value;
};
int main() {
union combine test;
test.bitvalues.x = 1;
test.bitvalues.y = 0;
test.bitvalues.z = 1;
test.bitvalues.pad = 0;
printf("result: %d\n", test.value);
return 0;
}
然而,重要的是要注意,因为您使用的是位域和联合的组合,这不是便携式解决方案。它取决于您定义位的顺序,匹配该机器上整数的位/字节顺序。因此,有一种方法可以在没有位移的情况下完成,但是你几乎肯定会更好地使用位移解决方案。