2011-09-03 94 views
2

所以我有一個問題,我的班,我有麻煩開始。我不是要求人們爲我解決問題,我只是想向正確的方向推動。我需要在C中創建一個函數,當給定任何32位整數時,它返回一個整數,其中每個第4位設置爲從最小sig位開始的1。我明白到底它應該是什麼樣子,但是開始我迷失了方向。我們不允許使用任何for循環或條件,只是標準的按位和邏輯運算符(!〜&^| + < < >>)。再一次,我沒有要求任何人爲我做這件事,我只想幫助我思考正確的道路。我在這裏和其他網頁上看到了其他一些帖子,但似乎沒有人點擊。我知道你可以將1移到某個特定的地方,但除此之外,我被卡住了。任何幫助,將不勝感激。幫助開始分配特定位

回答

0

結賬bitmasking

... 因此,要確保一點上,也可以用1來退出一點不變,或使用一個0

所以掩蓋你的情況下(而其它位不變)將是:

二進制:10001000100010001000100010001000 十六進制:88888888

1

你能寫下來(十六進制)的32位整數,其中的每第4位設爲1,所有其他位設爲0?

現在,是否有一個操作可以應用於您的輸入和這個幻數,它將輸入的每個第4位設置爲1,而是讓其他位保持獨立?

2
int get_int_with_every_fourth_bit_set() 
{ 
    return 0x88888888; 
} 

好吧,那大部分都是非常有趣的。這是一個什麼樣的位運算符做一個列表:

  • 位NOT(~):切換位,0比1和1比0
  • AND(&):設置一個位,如果在該位置的位在兩個操作數
  • OR被設置(|):如果在該位置的比特中任一操作數被設定設定位
  • XOR(^):如果在該位置正好一個位被設置在兩者之間設定位操作數
  • 按位移(<<>>):在指定的方向上移動指定量的每一位。當左移時,零被添加到最低有效位。右移時,如果該值爲無符號或正值,則將添加零。

這裏有一些按位技巧,好知道:

按比特移位由一個離開相同乘以2。按位向右移動與按2分割相同,並向下舍入。

兩個的所有冪只有一個1位。要看到,如果一個數是2的冪,你可以這樣做:

return !(x & (x - 1)) && x

舉個例子,說x = 16,這是兩個電源。然後,x - 1 = 15,所以要進行與運算的值是0001000000001111。由於每個位的位置在兩個操作數中的至少一箇中具有零,所以結果爲零。 !0爲真,因此請檢查x != 0。由於16 != 0,該語句返回true。如果您使用不是2的冪而不是0的數字進行嘗試,則x & (x - 1)檢查將始終爲真。非常酷!

另一個祕訣:因爲0^0 = 01^1 = 0,您可以使用XOR看什麼位有變化。例如,如果您有兩個字節並且希望看到之間發生變化的位,則兩個字節的異或將在所有已更改位的位置上給出1。

+0

也許OP在尋找'a_32bit_int | 0x88888888'? –

+0

對不起,不知道這個問題已經過去了幾年... –