Re: [問題] 計算數字的二進制長度

看板C_and_CPP (C/C++)作者 (Alien)時間16年前 (2009/09/17 21:04), 編輯推噓4(4010)
留言14則, 4人參與, 最新討論串3/4 (看更多)
※ 引述《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

09/17 21:09, , 1F
少打了一個 "!"
09/17 21:09, 1F

09/17 21:12, , 2F
!(x & (1 << i) 和 i+1 果然是短碼達人...
09/17 21:12, 2F

09/17 21:15, , 3F
不過shift的次數有討論的空間...
09/17 21:15, 3F

09/17 21:40, , 4F
小弟比較喜歡反方向說XD
09/17 21:40, 4F

09/17 21:40, , 5F
i=0; for(i=0; x; ++i, x>>=1); return i; 這樣:)
09/17 21:40, 5F

09/17 21:41, , 6F
不過前題是x必須是正值, 不然迴圈就停不下來了....Orz
09/17 21:41, 6F

09/17 21:46, , 7F
不喜歡迴圈的話還可以搞個遞迴版的來算....XDDD
09/17 21:46, 7F

09/17 22:13, , 8F
明顯我老眼昏花了 XDD btw, 我的寫法旨在簡化每個
09/17 22:13, 8F

09/17 22:14, , 9F
iteration 所做的東西, 不然又 <<=1 又 -- 蠻混亂的
09/17 22:14, 9F

09/17 22:21, , 10F
既然如此, 小弟就一定要推一下遞迴版的了....
09/17 22:21, 10F

09/17 22:22, , 11F
int binaryLength(unsigned int x, int i=0) {
09/17 22:22, 11F

09/17 22:22, , 12F
return x>0 ? binaryLength(x>>1, i+1) : i; }
09/17 22:22, 12F

09/17 22:23, , 13F
這個寫法~~~~根本就是來亂在惡搞的....XDDD
09/17 22:23, 13F

09/17 22:48, , 14F
遞迴版好物!
09/17 22:48, 14F
文章代碼(AID): #1AiZFPX0 (C_and_CPP)
文章代碼(AID): #1AiZFPX0 (C_and_CPP)