/* bit hacks */
#include <stdio.h>
#define CHAR_BIT 8
int main(void) {
/* 1) determine the sign of an integer */
int v;
int sign;
v = 17;
sign = v < 0;
printf("%d %d\n", v, sign);
v = 0;
sign = v < 0;
printf("%d %d\n", v, sign);
v = -17;
sign = v < 0;
printf("%d %d\n", v, sign);
printf("\n");
v = 17;
sign = -(v < 0);
printf("%d %d\n", v, sign);
v = 0;
sign = -(v < 0);
printf("%d %d\n", v, sign);
v = -17;
sign = -(v < 0);
printf("%d %d\n", v, sign);
printf("\n");
v = 17;
sign = v >> (sizeof(int) * CHAR_BIT - 1);
printf("%d %d\n", v, sign);
v = 0;
sign = v >> (sizeof(int) * CHAR_BIT - 1);
printf("%d %d\n", v, sign);
v = -17;
sign = v >> (sizeof(int) * CHAR_BIT - 1);
printf("%d %d\n", v, sign);
printf("\n");
v = 17;
sign = (v > 0) - (v < 0);
printf("%d %d\n", v, sign);
v = 0;
sign = (v > 0) - (v < 0);
printf("%d %d\n", v, sign);
v = -17;
sign = (v > 0) - (v < 0);
printf("%d %d\n", v, sign);
printf("\n");
/* 2) determine if two integers have the same sign */
int x, y;
int f;
x = 17;
y = 17;
f = ((x ^ y) < 0);
printf("%d\n", f);
x = 17;
y = -17;
f = ((x ^ y) < 0);
printf("%d\n", f);
printf("\n");
/* 3) determine the absolute value of w */
int w;
unsigned int r;
int mask;
w = 17;
mask = w >> sizeof(int) * CHAR_BIT - 1;
r = (w + mask) ^ mask;
printf("%x %x %x %d\n", w, mask, w + mask, r);
w = -17;
mask = w >> sizeof(int) * CHAR_BIT - 1;
r = (w + mask) ^ mask;
printf("%x %x %x %d\n", w, mask, w + mask, r);
return 0;
}