2011-03-20 57 views
2
usigned int val = 1; 
val <<= 30; 
cout << intToBin(val) << endl; 

string intToBin(unsigned int val) { 
    unsigned int k=1; 
    string ret; 
    while (k <= val) { 
     if (k & val) { 
      ret.insert(0,"1"); 
     } else { 
      ret.insert(0,"0"); 
     } 
     k <<= 1; 
    } 
    return ret; 
} 

這將寫入1和30x 0這是沒關係的。但我需要的是讓最高位的1位,即在第一個位置 - 接着是31x零。但是當我嘗試val < < = 31;沒有什麼是寫的,我不明白。你能爲我澄清一下嗎?int的二進制移位不可能

謝謝

+0

沒有被寫入裝置,該前k個被評估除Val更大。所以要麼你沒有正確使用unsigned,你的體系結構只有31位寬或者遇到了一個編譯器錯誤。順便說一句,發出二進制表示的方式非常奇怪,我只是從最高位開始,並在第一個非零位發出字符。這些前置插入的成本要比測試最差情況下的n-1比特要多得多(除非你使用的是非常長的數字)。我知道當前體系結構正在使用的最大C字長度:長128位。 – datenwolf 2011-03-20 12:19:16

回答

5

while循環不會終止,如果val>= 2^31

這是因爲k == 2^31仍然是<=val2^31 << 1 == 2^32溢出併成爲0.哪些仍然小於限制。

你也可以擴展你的條件來打破,如果k == 0也是,那麼問題應該消失。

^裝置求冪在這篇文章中沒有XOR)

+0

什麼是愚蠢的錯誤!謝謝 – tsusanka 2011-03-20 12:18:47