#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdint.h>

/*
void kill(uint32_t bit, unsigned char *a){
	//unsigned char the_bit;
	//unsigned char e_else;
	if(bit == 0){
		*(unsigned char *)a = *(unsigned char *)a & 0xFFFFFFF0;
		//the_bit = *(unsigned char *)a & 0x0000000F;
		//e_else = *(unsigned char *)a & 0xFFFFFFF0;
		//*(unsigned char *)a = e_else & 0xFFFFFFF0 b ^ 0;
	}else if(bit){
		*(unsigned char *)a = *(unsigned char *)a & 0xFFFFFF0F;
	}else if(bit == 2){
		*(unsigned char *)a = *(unsigned char *)a & 0xFFFFF0FF;
	}else if(bit == 3){
		*(unsigned char *)a = *(unsigned char *)a & 0xFFFF0FFF;
	}else if(bit == 4){
		*(unsigned char *)a = *(unsigned char *)a & 0xFFF0FFFF;
	}else if(bit == 5){
		*(unsigned char *)a = *(unsigned char *)a & 0xFF0FFFFF;
	}else if(bit == 6){
		*(unsigned char *)a = *(unsigned char *)a & 0xF0FFFFFF;
	}else{
		*(unsigned char *)a = *(unsigned char *)a & 0x0FFFFFFF;
	}

	//*(unsigned char *)a = *(unsigned char *)a & 0x0000000F;

}

void Toggle(uint32_t bit, unsigned char *a){
	unsigned char b = 0;
	if(bit == 7){
		b = 0x80;
	}else if(bit == 6){
		b = 0x40;
	}else if(bit == 5){
		b = 0x20;
	}else if(bit == 4){
		b = 0x10;
	}else if(bit == 3){
		b = 0x8;
	}else if(bit == 2){
		b = 0x4;
	}else if(bit == 1){
		b = 0x2;
	}else{
		b = 0x1;
	}
	*(unsigned char *)a |= b;

}


//void Toggle(uint32_t bit, unsigned char *a){
//	
//}

int Alive(uint32_t bit, unsigned char *a){
	int ret_val = 0;
	if(bit == 7){
		if(*(unsigned char *)a & 0x80)
			ret_val = 1;
	}else if(bit == 6){
		if(*(unsigned char *)a & 0x40)
			ret_val = 1;
	}else if(bit == 5){
		if(*(unsigned char *)a & 0x20)
			ret_val = 1;
	}else if(bit == 4){
		if(*(unsigned char *)a & 0x10)
			ret_val = 1;
	}else if(bit == 3){
		if(*(unsigned char *)a & 0x8)
			ret_val = 1;
	}else if(bit == 2){
		if(*(unsigned char *)a & 0x4)
			ret_val = 1;
	}else if(bit == 1){
		if(*(unsigned char *)a & 0x2)
			ret_val = 1;
	}else{
		if(*(unsigned char *)a & 0x1)
			ret_val = 1;
	}
	return ret_val;
}
*/

void Set(uint32_t bit, unsigned char *a){
	*(unsigned char *)a |= 1 << bit;

}

void Clear(uint32_t bit, unsigned char *a){
	*(unsigned char *)a &= ~(1 << bit);

}

void Toggle(uint32_t bit, unsigned char *a){
	*(unsigned char *)a ^= 1 << bit;
}

int Alive(uint32_t bit, unsigned char *a){
	if( *(unsigned char *)a & (1 << bit) )
		return 1;
	else
		return 0;
	//return( *(unsigned char *)a & (1 << bit) );
}

void ToggleNthBit(uint32_t bit, unsigned char *a) {

	if( *(unsigned char *)a & (1 << bit) )
		*(unsigned char *)a &= ~(1 << bit);
	else
		*(unsigned char *)a |= (1 << bit);

	//return num;
}

#define HEIGHT 1800
#define WIDTH 3600

//#define DEAD_TOGGLE(a,b,op) \
//((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

#define DEAD_TOGGLE(array, src_y, src_x) \
((array)[(size_t)(src_y)][(size_t)(src_x)/8] ^= 1 << ((src_x) % 8))
unsigned char Alive2[HEIGHT][WIDTH/4];

//#define PRINT_ALIVE(array, src_y, src_x) \
//((array)[(size_t)(src_y)][(size_t)(src_x)/8] & 1 << ((src_x) % 8))

int Print_Alive(src_y, src_x){
	if( Alive2[src_y][src_x/8] & (1 << (src_x % 8)) )
		return 1;
	return 0;
}

/*
#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

To set a bit:

BITOP(array, bit, |=);

To clear a bit:

BITOP(array, bit, &=~);

To toggle a bit:

BITOP(array, bit, ^=);

To test a bit:

if (BITOP(array, bit, &)) ...

etc.

*/

int main(int argc, char **argv){
	unsigned int n1, n2;
	unsigned char c1[8] = {0, 1, 0, 0, 0, 0, 0, 1};
	unsigned char c2 = 0;
	unsigned char c3 = 0;
	//unsigned char c1 = 5;
	//unsigned char c2 = 6;
	//unsigned char c3 = 7;
	//unsigned char c4 = 8;
	//if( floor((double)c1/4) != floor((double)c2/4) )

	//(void)memset((void *)c1, '\0', 8);
	
	//c2 = c1 << 7;

	for(n1=0; n1<8; n1++){
		//printf("%u\n", c2);
		Toggle(n1, &c2);
		//ToggleNthBit(n1, &c2);
		printf("%u ", c2);
		//if(c1[n1]){
		//c3 = c1[n1] & 0x0000000F;
		//c2 = c3 ^ 0;
		//if(c2)
		printf("%u\n", Alive(n1, &c2) );
		//}
		//printf("%u\n", c2);
	}
	Toggle(2, &c2);
	Toggle(4, &c2);
	//ToggleNthBit(2, &c2);
	//ToggleNthBit(4, &c2);
	//Toggle(2, &c2);
	for(n1=0; n1<8; n1++){
		printf("%u\n", Alive(n1, &c2) );
	}


	(void)memset( (void *)Alive2, '\0', HEIGHT*WIDTH/4);

	printf("\n\n%u\n", Print_Alive(2, 5) );

	DEAD_TOGGLE(Alive2, 2, 5);

	printf("%u\n", Print_Alive(2, 5) );

	//printf("%u\n", Alive(n1, &c2) );







	//printf("%u\n", c2);

	//printf("%u\n", c2);


	return 0;
}