用C語言實現遞歸函數的位運算

所以我對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。

你有什么辦法讓它工作嗎?

? 最佳回答:

代碼中有兩個問題:

  • 當設置了2個低位中的一個時,立即返回0。這是不正確的。如果參數為0,則應返回0;如果2個低位為非0,則應添加一個遞歸值。
  • 遞歸時將abcCode轉換為(unsigned),這可能會掩蓋最重要的位。你應該改用(unsigned long)

以下是一個修改版本:

int abcLength(long abcCode) {
    int n = 0;
    if (abcCode == 0)
        return 0;
    if (abcCode & 3)
        n++;
    return n + abcLength((unsigned long)abcCode >> 2);
}

這可以混淆為:

int abcLength(long code) {
    return code ? !!(code & 3) + abcLength((unsigned long)code >> 2) : 0;
}

下面是一個帶循環的解決方案:

  • 在偶數和奇數位置合并位
  • 迭代以計算具有低位集的字節數

Simple implementation:

int abcLength(long x) {
    unsigned long code = x;
    int n;
    for (n = 0; code != 0; code >>= 2) {
         if (code & 3)
            n++;
    }
    return n;
}

這是一個沒有任何循環的可能更快的方法:

int abcLength(long code) {
    code = (code | (code >> 1)) & 0x5555555555555555;
    code = (code + (code >> 2)) & 0x3333333333333333;
    code = (code + (code >> 4)) & 0x0F0F0F0F0F0F0F0F;
    return (code * 0x101010101010101) >> 56;
}
主站蜘蛛池模板: 久久99精品波多结衣一区| 亚洲日本久久一区二区va| 无码国产精品一区二区免费3p| 美女免费视频一区二区| 在线播放精品一区二区啪视频| 国产一区二区三区美女| 国模精品一区二区三区视频 | 日韩精品无码一区二区三区四区| 清纯唯美经典一区二区| 日韩国产精品无码一区二区三区| 日本高清一区二区三区| 日韩精品一区二区三区不卡| 中文字幕一区二区三区在线不卡 | 精品国产a∨无码一区二区三区| 亚洲国产系列一区二区三区 | 一区二区三区在线| 国偷自产一区二区免费视频| 韩国福利影视一区二区三区| 亚拍精品一区二区三区| 视频一区二区在线播放| 国产激情з∠视频一区二区| 无码丰满熟妇一区二区| 国产免费播放一区二区| 精品无码成人片一区二区98 | 制服中文字幕一区二区| 免费播放一区二区三区| 精品一区二区三区影院在线午夜 | 国产伦精品一区二区三区免.费 | 国产美女一区二区三区| 一区在线观看视频| 激情亚洲一区国产精品| 国产成人精品一区在线| 亚洲AV无码一区二区大桥未久| 中文字幕一区日韩在线视频| 国产精品无码一区二区在线观| 亚洲av无码一区二区三区网站| 国产一区二区三区亚洲综合| 亚洲美女视频一区二区三区| 色妞AV永久一区二区国产AV| 精品日韩一区二区| 亚洲国产美国国产综合一区二区 |