輸入:unsigned char *ch、長度 imagewidth
輸出:每位元與前一位元比較,相同累計計數,不同則輸出前區段長度並重新計數。
prev_bit 記錄上一位值,run_len 記錄當前連續長度。#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 ...。可根據實際需求調整輸出格式或儲存結構。