ビット列を走査するプログラムの関数化
char型の変数に0or1を入れて擬似的にビット列にした配列をLSBからMSBまで走査し、一致したらループを抜け終了するプログラムをCで書きたいと思っています。
他のプログラムでも使いまわし、かつ見やすくするためにこの部分を関数化したいのです。ソースにはbreakを使っているのですが、当然ながらbreakはforかwhile内で使わないとダメだと思いますが、ソース作成の都合上、for文は関数内に入れたくないのです。
(つまり、条件分岐を関数化したものをfor文内で用いたい)
うまい方法が思いつかずに困っています。もし良い方法をお気づきの方がおられたらご助力下さい。
//===============================================//
//=================以下ソース====================//
//===============================================//
//ビット配列correct_ciphertextとPbinを比較するプログラム
//LSBからMSBまで順に走査を行い、違うビットが出てきた時点でbreakし、走査を止める
//Pbinは固定値を与えている
#include <stdio.h>
#include <string.h>
unsigned int mes[2];
unsigned int key[2];
char Pbin[64];
char Kbin[64];
char ciphertext[64] = { 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0};
void ConvertPtextToBin_ForHost(unsigned int mes[]){
unsigned int tmp_mes[2] = {mes[0], mes[1]};
int i, j;
for(j=0;j<=1;j++){
for(i=0;i<=31;i++){
Pbin[j*32 + 31-i] = tmp_mes[j] % 2;
tmp_mes[j] = tmp_mes[j] / 2;
}
}
}
int main(int argc, char *argv[]){
//initialize
mes[0] = 0x00000000;
mes[1] = 0x00000000;
int i, j, k;
int x=0, y=0;
while(1){
printf("mes[1] = %d\n", mes[1]);
ConvertPtextToBin_ForHost(mes);
for(i=0; i<64; i++){
printf("%d", Pbin[i]);
if((i+1)%8 == 0)
printf(" ");
}
printf("\n");
//*************************
//ビット走査
//*************************
for(k=0; k<64; k++){
if( (ciphertext[63-k] == Pbin[63-k]) ){
//同じビットであれば、次のビットを走査する
}else{
printf("Error\n");//後ろから走査していって、1ビットでも違うものがあれば違うビット列と判断する
break;
}
}
//ここに来たら違うビット列だったということ
if(k != 64){
mes[1]++;
printf("Not match ciphertext... %dth bit didn't match. (0bit:LSB)\n", k);
printf("This was %d*%dth Search...\n\n", y, x);
x++;
if(x>=65535){i=0; y++;}
}else{
//k=64つまり、最後のビットまで同じビットだったということ⇒つまり、「発見」
printf("Match ciphertext\n");
printf("This was %d*%dth Search...\n\n", y, x);
break;
}
//***********************
//ビット走査の終了
//***********************
}
}
補足
図書いて位置から考えなおして見ました。 count_bits(unsigned x)に受け渡されているのはcount_bits(~0U)から~0Uで int count_bits(unsigned x) { int count=0; while(x){ if(x&1U)count++; x>>=1; } return(count); } ここの処理は int count=0; while(~0U){ if(~0U&1U)count++; x>>=1; } 私の処理系ではcount=32となって、int int_bits(void)で、32をint_bits()に返す。 右シフトを31から0までの表示を行っているんでしょうか?