# 2018q3 Homework5 (bits) contributed by < [`dange0`](https://github.com/dange0) > ###### tags: `sysprog2018` ## 實做 ### absVal ```cpp int absVal(int x) { int y; y = x >> 31; return (x ^ y) - y; } ``` ### addOK ```cpp int addOK(int x, int y) { unsigned int x_msb, y_msb, sum_msb; y_msb = (y >> 31); x_msb = (x >> 31); sum_msb = ((x + y) >> 31); return (((x_msb ^ y_msb) + ((~(x_msb ^ y_msb)) & (~(x_msb ^ sum_msb)))) & 0x1); } ``` ### allEvenBits ```cpp int allEvenBits(int x) { x &= x >> 2; x &= x >> 4; x &= x >> 8; x &= x >> 16; return (x & 0x1); } ``` ### allOddBits ```cpp int allOddBits(int x) { x &= x >> 2; x &= x >> 4; x &= x >> 8; x &= x >> 16; return ((x >> 1) & 0x1); } ``` ### anyEvenBit ```cpp int anyEvenBit(int x) { x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return (x & 0x1); } ``` ### anyOddBit ```cpp int anyOddBit(int x) { x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return ((x >> 0x1) & 0x1); } ``` ### bang ```cpp int bang(int x) { x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return (~x & 0x1); } ``` ### bitAnd ```cpp int bitAnd(int x, int y) { return ~(~x | ~y); } ``` ### bitCount ```cpp int bitCount(int x) { int mask1 = 0x55; int mask2 = 0x33; int mask3 = 0x0F; int mask4 = 0xFF; int mask5 = 0xFF; mask1 |= mask1 << 8; mask1 |= mask1 << 16; mask2 |= mask2 << 8; mask2 |= mask2 << 16; mask3 |= mask3 << 8; mask3 |= mask3 << 16; mask4 |= mask4 << 16; mask5 |= mask5 << 8; x = (x & mask1) + ((x >> 1) & mask1); x = (x & mask2) + ((x >> 2) & mask2); x = (x & mask3) + ((x >> 4) & mask3); x = (x & mask4) + ((x >> 8) & mask4); x = (x & mask5) + ((x >> 16) & mask5); return (x & mask5); } ``` 0101 0101 0101 0101 0101 0101 0101 0101 0011 0011 0011 0011 0011 0011 0011 0011 0000 1111 0000 1111 0000 1111 0000 1111 0000 0000 1111 1111 0000 0000 1111 1111 0000 0000 0000 0000 1111 1111 1111 1111 ### bitNor ```cpp int bitNor(int x, int y) { return ~x & ~y; } ``` ### bitOr ```cpp int bitOr(int x, int y) { return ~(~x & ~y); } ``` ### bitParity ```cpp int bitParity(int x) { x ^= x >> 1; x ^= x >> 2; x ^= x >> 4; x ^= x >> 8; x ^= x >> 16; return x & 0x1; } ```