作者adrianshum (Alien)
看板C_and_CPP
標題Re: [問題] 計算數字的二進制長度
時間Thu Sep 17 21:04:24 2009
※ 引述《bleed1979 (十三)》之銘言:
: ※ 引述《chrisjon (與程式最後的決戰)》之銘言:
: : 請問有直接計算二進制長度的語法嗎?
: : 例如:12(10) = 1100(2)
: : 那長度就是 4
: : 我是有想說寫a|(2^31-1),然後再&1計算1有幾個就是它的長度
: : 不過,是否有直接的語法可以用呢?
: 沒有特別去想有沒有特殊解法, 直觀的做法就是最左邊的1出現的位置
: #include <stdio.h>
: int Blen(int a)
: {
: int i,b;
: for (i=31,b=0x80000000;i>=0 && !(a&b);i--,b>>=1)
: ;
: return(i+1);
: }
: int main(void)
: {
: printf("%d\n",Blen(12));
: return(0);
: }
: Bleed
你這個做法的話, 可以寫得簡單一點:
(沒有測試過, 應該可以吧 XDD )
int binaryLength(int x) {
int i;
for (i = 31; i > 0 && (x & (1 << i)) ; i--){
}
return i;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.155.236.82
1F:推 suhorng:少打了一個 "!" 09/17 21:09
2F:→ bleed1979:!(x & (1 << i) 和 i+1 果然是短碼達人... 09/17 21:12
3F:→ bleed1979:不過shift的次數有討論的空間... 09/17 21:15
4F:推 VictorTom:小弟比較喜歡反方向說XD 09/17 21:40
5F:→ VictorTom:i=0; for(i=0; x; ++i, x>>=1); return i; 這樣:) 09/17 21:40
6F:→ VictorTom:不過前題是x必須是正值, 不然迴圈就停不下來了....Orz 09/17 21:41
7F:推 VictorTom:不喜歡迴圈的話還可以搞個遞迴版的來算....XDDD 09/17 21:46
8F:→ adrianshum:明顯我老眼昏花了 XDD btw, 我的寫法旨在簡化每個 09/17 22:13
9F:→ adrianshum:iteration 所做的東西, 不然又 <<=1 又 -- 蠻混亂的 09/17 22:14
10F:推 VictorTom:既然如此, 小弟就一定要推一下遞迴版的了.... 09/17 22:21
11F:→ VictorTom:int binaryLength(unsigned int x, int i=0) { 09/17 22:22
12F:→ VictorTom: return x>0 ? binaryLength(x>>1, i+1) : i; } 09/17 22:22
13F:→ VictorTom:這個寫法~~~~根本就是來亂在惡搞的....XDDD 09/17 22:23
14F:→ adrianshum:遞迴版好物! 09/17 22:48