exc/k&r/02-types-operators-and-exp/02-07.c

33 lines
675 B
C

#include <stdio.h>
#include <stdlib.h>
#include "02-bitwise.h"
unsigned invert(unsigned x, int p, int n);
/* parse command line args for invert, print result */
int main(int argc, char *argv[])
{
if (argc < 4) {
printf("error : expected 3 arguments x p n\n");
return 1;
}
unsigned x;
int bx = int_of_string(&x, argv[1]);
int p = atoi(argv[2]);
int n = atoi(argv[3]);
if (!bx) {
return 2;
}
printd_base(bx, invert(x, p, n));
putchar('\n');
return 0;
}
/* invert: invert n bits of x at positon p (right adjusted) */
unsigned invert(unsigned x, int p, int n)
{
return x ^ (~(~0 << n) << (p-n+1));
}