#include <stdio.h>

int rotate( int a, int b ) {
	b = b & 0x1F;
	if( b == 0 ) return a;
	return (a >> b) + (a << (32 - b));
	}

int shift( int a, int b ) {
	int m;
	
	a = rotate( a, b );
	m = rotate( 1, b ) - 1;

	/* if( b > 31 || b < -31 ) return 0; */
	a = a*(b > -32);
	a = a*(32 > b);
	
	/* b = 0; if( 1 > b ) b = -1 */
	b = 1 > b;
	b = -1 * b;
	
	m = b ^ m;
	a = a & m;
	return a;

/*	if( b > 31 || b < -31 ) return 0;
	if( b > 0 ) return rotate( a, b ) & (rotate( 1, b ) - 1);
	return rotate( a, b ) & (0xFFFFFFFF ^ (rotate( 1, b ) - 1));
*/	}

int main() {
	int a = 0x12345678, b, c, d, e;
	
	for( b = -40; b < 40; b += 1 ) {
		if( b < 0 ) c = a << -b;
		else c = a >> b;
		d = rotate( a, b );
		e = shift( a, b );
		if( c != e ) printf( "!!" );
		printf( "%3d, 0x%08X, 0x%08X, 0x%08X\n", b, c, d, e );
		}
	
	return 0;
	}
