2011-09-07 86 views
0

在3操作我怎麼可以把一個字節爲32位的int符合這樣的:很簡單掩蓋

0x1fffe

我只能明確地在同一時間訪問一個字節因此,我開始爲0xFF,然後接班。

我可以使用4個操作,但我找不到一種方法來消除一個操作。

int mask2 = 0xFF << 8; 
    mask2 = mask2 | 0xFE; 
    mask2 = mask2 + mask2; 
    mask2 = mask2 | 0x02; 

任何想法?

換句話說,我需要一個掩碼,0x1FFFE在3個操作中被做出,而像例子那樣只在時間處訪問一個字節。

+0

這不是非常清楚你在嘗試什麼(特別是你的約束),我看到* 3 *字節在這裏使用,不包括其他兩個整數文字... –

+0

我把一個字節,0xFF變成一個32位int,0x001FFFFE 4個操作符。我怎樣才能在3中使用相同的限制? – Peter

+0

您正在使用3個不同的字節作爲操作數... 0xff,0xfe,0x02。 –

回答

2

也許這是你想要的...你開始一個單一字節值(0xFF)以及你在它的工作與3個按位操作,獲得0x1fffe。

int in = 0xff; 
int out = in<<9 | in<<1; 
+0

呃!謝謝你的理解! – Peter

1

兩個操作:

res = (1 << 17) - 2 
+0

'(1 << 17)-2'更短 –

+0

呵呵是的,剛剛意識到:) – duedl0r

2

移位,加,移位,這三種操作,對不對?

((0xff << 8) + 0xff) << 1

+0

+1,但我會用'|'改變'''使它只使用按位運算。 –

0
int mask2 = 0xFF; 
mask2 |= mask2 << 8; 
mask2 += mask2; 
0

如何:

((~0xffU) >> 11) - 1 

這是假設32位整數...

也許這是更好的表述爲:

uint32_t x = 0xff; 

x = ~x; 
x >>= 11; 
x -= 1; 
+0

我的64位機器不喜歡那個... –

+0

@Omri - 是的,我正在實現,因爲我寫出來,我的第一個例子假設'int'是32位。它也有問題,因爲'0xff'被簽名。我修正了它,並提供了一個明確使用'uint32_t'的示例。 – asveikau