#include<stdio.h>
unsigned getbits(unsigned x, int p, int n)
{
/* Build a mask consisting of 'n' bits */
/* ...111 */
int all_ones = ~0;
/* ...111000 */
int all_ones_shifted_left = all_ones << n;
/* ...000111 */
int mask = ~all_ones_shifted_left;
/* Shift 'x' down to discard lower bits we don't care about */
/* How many bits do we discard? */
int shift_down = p + 1 - n;
/* ...76543210 -> ...765432 */
unsigned int x_shifted_down = x >> shift_down;
/* Use the mask to discard the upper bits we don't care about */
return x_shifted_down & mask;
}
int main(void)
{
/* Decimal 8 is binary 1000 */
unsigned x = 8;
/* Position 4 starts at ...[43210 */
int p = 4;
/* 3 bits means the range is ...[432]10 */
int n = 3;
printf("%d", getbits
(x
, p
, n
)); return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KCnVuc2lnbmVkIGdldGJpdHModW5zaWduZWQgeCwgaW50IHAsIGludCBuKQp7CgkvKiBCdWlsZCBhIG1hc2sgY29uc2lzdGluZyBvZiAnbicgYml0cyAqLwoJLyogLi4uMTExICovCglpbnQgYWxsX29uZXMgPSB+MDsKCS8qIC4uLjExMTAwMCAqLwoJaW50IGFsbF9vbmVzX3NoaWZ0ZWRfbGVmdCA9IGFsbF9vbmVzIDw8IG47CgkvKiAuLi4wMDAxMTEgKi8KCWludCBtYXNrID0gfmFsbF9vbmVzX3NoaWZ0ZWRfbGVmdDsKCgkvKiBTaGlmdCAneCcgZG93biB0byBkaXNjYXJkIGxvd2VyIGJpdHMgd2UgZG9uJ3QgY2FyZSBhYm91dCAqLwoJLyogSG93IG1hbnkgYml0cyBkbyB3ZSBkaXNjYXJkPyAqLwoJaW50IHNoaWZ0X2Rvd24gPSBwICsgMSAtIG47CgkvKiAuLi43NjU0MzIxMCAtPiAuLi43NjU0MzIgKi8KCXVuc2lnbmVkIGludCB4X3NoaWZ0ZWRfZG93biA9IHggPj4gc2hpZnRfZG93bjsKCgkvKiBVc2UgdGhlIG1hc2sgdG8gZGlzY2FyZCB0aGUgdXBwZXIgYml0cyB3ZSBkb24ndCBjYXJlIGFib3V0ICovCQoJcmV0dXJuIHhfc2hpZnRlZF9kb3duICYgbWFzazsKfQoKaW50IG1haW4odm9pZCkKewoJLyogRGVjaW1hbCA4IGlzIGJpbmFyeSAxMDAwICovCgl1bnNpZ25lZCB4ID0gODsKCS8qIFBvc2l0aW9uIDQgc3RhcnRzIGF0IC4uLls0MzIxMCAqLwoJaW50IHAgPSA0OwoJLyogMyBiaXRzIG1lYW5zIHRoZSByYW5nZSBpcyAuLi5bNDMyXTEwICovCglpbnQgbiA9IDM7CgoJcHJpbnRmKCIlZCIsIGdldGJpdHMoeCwgcCwgbikpOwoJcmV0dXJuIDA7Cn0=