題目描述:
題目要求是:unsigned int reverse_bits(unsigned int value);這個函數的返回值是把value的二進制位模式從左到右變換一下后的值。例如,在32位機器上,25這個值包含下列各個位:
00000000 00000000 00000000 00011001
函數的返回值應該是2 550 136 832,它的二進制位模式是:
10011000 00000000 00000000 00000000
要求是:不能讓函數依賴於機器上整型數值的長度。
答案代碼以及解釋:
題目看上去是比較簡單的,不知道大家是怎么想的。下意識的第一想是從這個value的最右邊處理,但遇到的問題是不知道該處理到什么時候停止。因為題目說不能假設unsigned int的長度。那你說怎么辦?不看答案,各位怎么想?
下面是書上摘抄的答案,個人加了幾句注釋
1 unsigned int 2 reverse_bits(unsigned int value) 3 { 4 unsigned int answer; 5 unsigned int i; 6 7 answer = 0; 8 9 /*把一個unsigned int 數字1一直左移,直到它變成全0的時候,也就得到了該機器內unsigned int的長度*/ 10 for (i = 1; i != 0; i <<= 1) 11 { 12 answer <<= 1; 13 if (value & 1) { answer |= 1; } 14 value >>= 1; 15 } 16 17 return answer; 18 }
個人覺得第10行的代碼是比較妙的,不知道大家怎么想,大家是怎么解決這個問題的。
Reference
《C和指針》 人民郵電出版社 P89 3題