2011-05-02 49 views
3

我有幾個方程將返回我的編號中的三個位中的每一個的二進制值。從C中的二進制「組件」構造一個int

我正在用C編寫這個程序,這對我來說是一種新的語言。假設我的方程式返回Y0 = 1Y1 = 0Y2 = 1101);我想將該值存儲爲5

如果這些值由不同的方程返回,這在C中是否可能?

我知道如何乘以做到這一點,但我在找我想象中已內置C.

函數或東西

回答

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 */ 
4

只是位位移:

Y0 | (Y1 << 1) | (Y2 << 2) 
4

有沒有這樣的功能在C標準庫中。

你需要做的事:

int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0); 
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; 
} 

它然而,必須指出,因爲您使用的是位域的組合和工會,這不是一個便攜式解決方案是很重要的。它取決於您定義位的順序,匹配該機器上整數的位/字節順序。所以,有一種方法可以在不改變位置的情況下做到這一點,但是您幾乎可以更好地使用位移解決方案。

相關問題