#!/usr/bin/awk -f
# rustic awk bitwise integer functions.  - A. Costa, Sat Apr 13 2002

function bit_and(a,b,    r,n)	# bitwise 'and'
{
	r=0	# result
	n=0	# bit place
	while (a&&b)
	{
		if ( (a*b)%2 )		# both odd?
			r+=2^n		# set bit 'n'
		a=int(a/2)
		b=int(b/2)
		n++
	}
	return r
}

function bit_or(a,b,    r,n)	# bitwise inclusive 'or'
{
	r=0	# result
	n=0	# bit place
	while (a||b)
	{
		if ( a%2 || b%2 )	# either odd?
			r+=2^n		# set bit 'n'
		a=int(a/2)
		b=int(b/2)
		n++
	}
	return r
}


function bit_xor(a,b,    r,n)	# bitwise 'xor'
{
	r=0	# result
	n=0	# bit place
	while (a||b)
	{
		if ( (a+b)%2 )		# only one odd?
			r+=2^n		# set bit 'n'
		a=int(a/2)
		b=int(b/2)
		n++
	}
	return r
}


function bit_not(a,    r,n)	# bitwise 'not'
{
	r=0	# result
	n=0	# bit place
	while (a)
	{
		if ( a%2==0 )		# even?
			r+=2^n		# set bit 'n'
		a=int(a/2)
		n++
	}
	return r
}


BEGIN {
x=73		# some test numbers...
y=62
printf("x=%d y=%d, x and y=%d, x or y=%d, x xor y=%d, not x=%d, not y=%d\n",
	x,y,bit_and(x,y), bit_or(x,y), bit_xor(x,y), bit_not(x), bit_not(y) )
}
