我有幾個方程將返回我的編號中的三個位中的每一個的二進制值。從C中的二進制「組件」構造一個int
我正在用C編寫這個程序,這對我來說是一種新的語言。假設我的方程式返回Y0 = 1
,Y1 = 0
和Y2 = 1
(101
);我想將該值存儲爲5
。
如果這些值由不同的方程返回,這在C中是否可能?
我知道如何乘以做到這一點,但我在找我想象中已內置C.
函數或東西我有幾個方程將返回我的編號中的三個位中的每一個的二進制值。從C中的二進制「組件」構造一個int
我正在用C編寫這個程序,這對我來說是一種新的語言。假設我的方程式返回Y0 = 1
,Y1 = 0
和Y2 = 1
(101
);我想將該值存儲爲5
。
如果這些值由不同的方程返回,這在C中是否可能?
我知道如何乘以做到這一點,但我在找我想象中已內置C.
函數或東西沒有這樣的運氣。你必須乘以(或移位,這是相同的)
unsigned Y0 = 1, Y1 = 0, Y2 = 1, val;
val = (Y0 * 4) + (Y1 * 2) + (Y2 * 1); /* parens */
val = (Y0 << 2) + (Y1 << 1) + (Y2 << 0); /* redundant */
只是位位移:
Y0 | (Y1 << 1) | (Y2 << 2)
有沒有這樣的功能在C標準庫中。
你需要做的事:
int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0);
雖然不是很受歡迎,你有一種替代方法,您可以使用位字段來進行操作的,你在談論的類型。因此,在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;
}
它然而,必須指出,因爲您使用的是位域的組合和工會,這不是一個便攜式解決方案是很重要的。它取決於您定義位的順序,匹配該機器上整數的位/字節順序。所以,有一種方法可以在不改變位置的情況下做到這一點,但是您幾乎可以更好地使用位移解決方案。