2016-11-08 46 views
-3

下面是說明:爪哇 - 設置一個整數的獨特位爲零

爲了阻止你需要破譯送給他的爪牙加密的消息瘋編碼器邪惡的天才。這條消息包含了幾個數字,當輸入一臺超級計算機時,將會發射一枚導彈進入遮擋太陽的天空,並讓地球上所有的人都變得脾氣暴躁和傷心。

您發現某些數字在其二進制表示中有一個修改的單個數字。更具體地說,在給定數量n中,從右邊開始的第k位最初被設置爲0,但其當前值可能不同。它現在你來寫,這將改變n的第k個比特回0

對於n = 37和k中的功能= 3,輸出應該是 killKthBit(N,K) 33. =

3710 = 1001012〜> 1000012 = 3310

對於n = 37和K = 4,輸出應該是

killKthBit(N,K)= 37

第4位爲0已經(貌似瘋狂的編碼器忘記加密此數),所以答案仍然是37.」

這裏是一個解決方案,我發現,我無法理解這一點:

int killKthBit(int n, int k) 
{ 
    return n & ~(1 << (k - 1)) ; 
} 

有人可以解釋什麼解決方案和它的語法?

回答

3

你的函數

1 << (k - 1)移位數1恰好k-1倍的表達的詳細解釋的左,以便爲一個8位的數目和k = 4一個例子:

移位之前:00000001
換檔後:00010000

這標誌着k生病。你看,1被轉移到第四個的位置,因爲它在位置。運營商~否定每一位,這意味着1變爲00變成1。在我們的例子:

否定之前:00010000
否定後:11101111

最後,&執行兩個操作數位與。讓我們說,我們有一個數字n = 17,它是二進制的00010001。現在示例是:

00010001 & 11101111 = 00000001

這是因爲這兩個號碼中的各個位由上同一位置比較。只有職位,其中兩個號碼1仍然1,其他所有其他設置爲0。因此,只有位置零仍然是1

總體而言,您的方法int killKthBit(int n, int k)與二元運算符完全相同,它將位置k的位n設置爲0

0

這裏是我的嘗試

//Returns a number that has all bits same as n 
// except the k'th bit which is made 0 
int turnOffK(int n, int k) 
{ 
    // k must be greater than 0 
    if (k <= 0) return n; 

    // Do & of n with a number with all set bits except 
    // the k'th bit 
    return (n & ~(1 << (k - 1))); 
}