所以我對C語言還很陌生,我正在參加一個在線課程,它為我提供練習。
我要做的是獲取一個長數據類型并根據它的二進制表示返回一個int值。規則是如果2most-right位不同于0(01,10,11),則將其計為1并移到下2位,依此類推。例如:
00000000-00000000-00000000-00000001-應返回1。
00000000-00000011-00000001-00000010-應返回3。
00001000-11000011-00001001-00110010-應返回7。
int abcLength(long abcCode) {
if(abcCode&3) { /*** <--- Try to do this using only bitwise and logical operators ! ***/
return 0;
}
return 1 + abcLength((((unsigned)abcCode>>2)); /*** <--- Try to do this using only bitwise and logical operators ! ***/
}
問題是我不知道如何處理二進制字符串中間有00的情況。他們告訴我只使用一個if語句,但現在是這樣,當它不應該的時候,它將計數00。
你有什么辦法讓它工作嗎?
代碼中有兩個問題:
0
。這是不正確的。如果參數為0,則應返回0
;如果2個低位為非0
,則應添加一個遞歸值。abcCode
轉換為(unsigned)
,這可能會掩蓋最重要的位。你應該改用(unsigned long)
。以下是一個修改版本:
這可以混淆為:
下面是一個帶循環的解決方案:
Simple implementation:
這是一個沒有任何循環的可能更快的方法: