抽象的に考えられない
具体例をゴリゴリして帰納法的に抽象化を試みるのは、能力的に悲しい気がする。
ハフマンもどきで満足気味なのもアレ。
配列サイズを自分で計算していないところが悲しさ3倍増し。
#include <stdio.h> #include <stdlib.h> int main() { unsigned int input[3] = { 0, 2, 3 }; unsigned int m[3][3] = { { input[0], input[1], input[2] }, { input[0], input[1], input[0] }, { input[2], input[1], input[0] } }; for( int i = 0; i < 3; ++i ) { for( int j = 0; j < 3; ++j ) printf( "%u ", m[i][j] ); printf( "\n" ); } unsigned char bits[5] = {0}; int index = 0; int n_bits = 0; int t = 0; for( int i = 0; i < 3; ++i ) { for( int j = 0; j < 3; ++j ) { if( m[i][j] == input[0] ) { n_bits += 1; if( n_bits <= 8 ) { bits[index] += input[0] << (8-n_bits); printf( "%u ", bits[index] ); } else { n_bits = 1; ++index; bits[index] += input[0] << (8-n_bits); } } else if( m[i][j] == input[1] ) { n_bits += 2; if( n_bits <= 8 ) { bits[index] += input[1] << (8-n_bits); printf( "%u ", bits[index] ); } else { t = n_bits-8; bits[index] += 1 << t; ++index; bits[index] += 0 << 7; n_bits = t+1; } } else if( m[i][j] == input[2] ) { n_bits += 2; if( n_bits < 8 ) { bits[index] += input[2] << ( 8-n_bits ); printf( "%u ", bits[index] ); } else { t = n_bits - 8; bits[index] += 1 << t; ++index; bits[index] += 1 << 7; n_bits = t+1; } } } } printf("\n"); for( int i = 0; i < 5; ++i ) printf( "%u\n", bits[i] ); for( int k = 0; k < 5; ++k ) { printf( "(" ); for( int i = 0; i < 8; ++i ) { if( bits[k] & (1<<(7-i)) ) printf( "1" ); else printf( "0" ); } printf( "b)\n" ); } unsigned int out[3][3] = { 0 }; index = 0; n_bits = 0; unsigned char tmp = 0; int save=0; int len = 0; //int i=0, j=0; for( int i = 0; i < 3; ++i ) { for( int j = 0; j < 3; ++j ) { while( 1 ) { tmp = (bits[index]<<n_bits); tmp = tmp >> 7;//(7-n_bits); printf( "%u", tmp ); ++len; save += tmp << (2-len); ++n_bits; if( n_bits == 8 ) { n_bits = 0; ++index; } if( tmp == 0 ) break; if( len == 2 ) break; } out[i][j] = save; save = 0; len = 0; break; } } printf( "\n" ); for( int i = 0; i < 3; ++i ) { for( int j = 0; j < 3; ++j ) printf( "%u ", out[i][j] ); printf( "\n" ); } return 0; }
コードが汚いのが矯正できないでいる。