bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

抽象的に考えられない

具体例をゴリゴリして帰納法的に抽象化を試みるのは、能力的に悲しい気がする。
ハフマンもどきで満足気味なのもアレ。
配列サイズを自分で計算していないところが悲しさ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;
}

コードが汚いのが矯正できないでいる。