[ create a new paste ] login | about

Link: http://codepad.org/WX1UsfmI    [ raw code | output | fork ]

programmingpraxis - C, pasted on Aug 8:
/* 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;
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
17 0
0 0
-17 1

17 0
0 0
-17 -1

17 0
0 0
-17 -1

17 1
0 0
-17 -1

0
1

11 0 11 17
ffffffef ffffffff ffffffee 17


Create a new paste based on this one


Comments: