#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>

uint32_t bitslice(uint32_t number, int hi, int lo);
uint32_t mask(int hi, int lo);

int main(int argc, char *argv[])
{
	uint32_t number;
	int range_hi;
	int range_lo;
	uint32_t result;
	
	/* check number of arguments */
	if (argc != 4) {
		printf("bad number of parameters\n");
		return -1;
	}

	/* load input into variables */
	sscanf(argv[1], "%x", &number);
	sscanf(argv[2], "%d", &range_hi);
	sscanf(argv[3], "%d", &range_lo);

	/* calculate and print result */
	result = bitslice(number, range_hi, range_lo);
	printf("%#x[%d:%d] = %#x\n", number, range_hi, range_lo, result);
	return 0;
}

uint32_t bitslice(uint32_t number, int hi, int lo)
{
	return (number >> lo) & mask(hi, lo);
}

uint32_t mask(int hi, int lo)
{
	uint32_t result = 0;
	if (hi - lo + 1 == 32)
		return ~result;
	return (1 << (hi - lo + 1)) - 1;
}

