#include <string.h>
#include <climits>
#include <bitset>
#include <arpa/inet.h>
#include <iostream>
int main () {
	char a = -58;
	std::bitset<8> x(a);
	std::cout << x;
	short c = -315;
	std::bitset<16> y(c);
	std::cout << y<<std::endl<<std::endl;
	
	int i = 0;
	std::bitset<16> bs(i);
	for ( i = 0; i< 1024+ 7; ++i) {
		bs = i;
		std::cout << bs<<std::endl;
	}
	long l = 1024 * 1024 * 1024 * 1024; //overflow
	
	std::cout<<"1024 * 1024 * 1024 * 1024  (long) is " <<l <<std::endl; //printing zero
	
	long long ll = 1024LL * 1024LL * 1024LL * 1024LL; //overflow
	std::bitset<64> bsll(1024LL * 1024LL * 1024LL * 1024LL);
	
	std::cout<<"1024 * 1024 * 1024 * 1024  (long long) is " <<ll <<std::endl; //printing zero
	
	std::cout<<bsll <<std::endl; //printing zero
	
	
	//BEG: test prat 3
	unsigned long long total = ULLONG_MAX;
	unsigned long upper = total / ULONG_MAX;
	unsigned long lower = total;
	
	
	memcpy(&lower, &total, sizeof lower);
	memcpy(&upper, (char *) &total + sizeof lower, sizeof upper);

	std::bitset<32> bsup(upper);// constructor accepts long only
	std::bitset<32> bslo(lower);// constructor accepts long only

	
	std::cout<<bsup <<std::endl; //printing zero
	std::cout<<bslo <<std::endl; //printing zero
	//END: test prat 3
	

	//BEG: test prat 4
	std::cout<<std::endl<<"Test prat 4:"<<std::endl; //printing zero
	unsigned long long start_pattern = ULLONG_MAX;
	unsigned long upper_pattern = 0LL;
	unsigned long lower_pattern = 0LL;

	memcpy(&lower_pattern, &start_pattern, sizeof lower_pattern);
	memcpy(&upper_pattern, (char *) &start_pattern + sizeof lower_pattern, sizeof upper_pattern);

	
	int spi = 0;
	for (spi = 0; spi< 64; ++spi) {
		//start_pattern &= ~(1 << spi);
		if ( spi < 32 ) {
			lower_pattern &= ~(1 << spi);
		} else {
			upper_pattern &= ~(1 << (spi-32));
		}
		std::bitset<32> bsup(upper_pattern);// constructor accepts long only
		std::bitset<32> bslo(lower_pattern);// constructor accepts long only
		std::cout<<bsup <<bslo <<std::endl; //printing zero
		//start_pattern &= ~(1 << spi);
		if ( spi < 32 ) {
			lower_pattern &= ~(1 << spi);
		} else {
			upper_pattern &= ~(1 << (spi-32));
		}
	}
	
	/*
	unsigned long justlong = ULONG_MAX;
	justlong &= ~(1 << spi);
	std::bitset<32> bs_justlong(justlong);
	std::cout<<bs_justlong <<std::endl; 
	
	unsigned long ullong = ULLONG_MAX;
	ullong &= ~(1 << spi);
	std::bitset<64> bs_ullong(ullong);
	std::cout<<bs_ullong <<std::endl; 
	*/

	
	//END: test prat 4

	
	// The following not work in cygwin
	//int x = 5;
	//u_long  transport = htonl(x);
	//std::cout.write(reinterpret_cast<const char*>(&transport), sizeof(u_long));
	
	//int x =  7 + 1024;
	//std::cout.write(reinterpret_cast<const char*>(&x), sizeof x);
	return 0;
}