首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言逐位掃描陣列統計 0/1 位元並檢測變化

     編輯:C 語言問答

需求:對位元組陣列逐位掃描,統計連續 0/1 區段長度

輸入:unsigned char *ch、長度 imagewidth
輸出:每位元與前一位元比較,相同累計計數,不同則輸出前區段長度並重新計數。

核心邏輯

  • 外層迴圈遍歷每個位元組。
  • 內層迴圈從 MSB (bit 7) 到 LSB (bit 0) 檢查各位。
  • 維護 prev_bit 記錄上一位值,run_len 記錄當前連續長度。
  • 位元間跨界:當前位元組的 bit 0 與下一位元組的 bit 7 相鄰。

參考實作

#include <stdio.h>

void choose(const unsigned char *ch, int imagewidth)
{
    int prev_bit = -1; // -1 表示尚無前一位
    int run_len  = 0;

    for (int i = 0; i < imagewidth; i++) {
        for (int b = 7; b >= 0; b--) {
            int cur_bit = (ch[i] >> b) & 1;

            if (prev_bit == -1) { // 第一位
                prev_bit = cur_bit;
                run_len = 1;
            }
            else if (cur_bit == prev_bit) {
                run_len++;
            }
            else {
                printf("%s:%d ", prev_bit ? "black" : "white", run_len);
                prev_bit = cur_bit;
                run_len = 1;
            }
        }
    }
    // 最後一段
    if (run_len > 0)
        printf("%s:%d\n", prev_bit ? "black" : "white", run_len);
}

int main()
{
    unsigned char test[256];
    for (int i = 0; i < 256; i++) test[i] = i;
    choose(test, 256);
    return 0;
}

說明

程式以 black 代表 1,white 代表 0,輸出格式為 black:3 white:5 ...。可根據實際需求調整輸出格式或儲存結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved