# 2018q3 Homework5 (bits) contributed by < `JEFF1033` > 安裝32位元組相關套件有問題,請輸入以下指令:` gcc-4.8-base:i386 gcc-4.9-base:i386 libc6:i386 libgcc1:i386 libstdc++6:i386 ` 即可完成安裝。 - 記得在btest.c中加上`#include<stdint.h> ` - 安裝32位元出現狀況可以參考這篇:https://akrabat.com/installing-32-bit-packages-on-ubuntu-14-04/ # 修改bits.c (等打完int後一併補上) ## int #### absVal ```c int absVal(int x) { int32_t y = x >> 31; return (x ^ y) + (y & 1); ``` #### addOK ```c int addOK(int32_t x, int32_t y) { int32_t sum = x + y; int over_neg = (x < 0) && (y < 0) && (sum >= 0); int over_pos = (x >= 0) && (y >= 0) && (sum < 0); return (!over_neg) && (!over_pos); } ``` #### allEvenBits ```c int allEvenBits(int32_t x) { int i, a = 1; for (i = 0; i <= 3; i++) { x = x & (x >> a * 2); a = a * 2; } return x = (x & 0x01); } ``` #### int allOddBits(int32_t x) ```clike= int i, a = 1; for (i = 0; i <= 3; i++) { x = x & (x >> a * 2); a = a * 2; } return x = (x >> 1 & 0x01); ``` #### int anyEvenBit ```clike= int anyEvenBit(int32_t x) { int i, a = 1; for (i = 0; i <= 3; i++) { x = x | (x >> a * 2); a = a * 2; } return x = (x & 0x01); } ``` #### int anyOddBit ```clike= int anyOddBit(int32_t x) { int i, a = 1; for (i = 0; i <= 3; i++) { x = x | (x >> a * 2); a = a * 2; } return x = (x >> 1 & 0x01); } ``` #### int bang(int32_t x) ```clike= int bang(int32_t x) { int i; for (i = 0; i <= 30; i++) { x = x | (x >> 1); } x = ~x & 0x01; return x; } ``` #### int bitAnd ```clike= int bitAnd(int x, int y) { return ~((~x) | (~y)); } ``` #### int bitCount ```clike= int bitCount(int x) { int mask1 = 0x55; int mask2 = 0x33; int mask3 = 0x0F; int result = 0; mask1 = mask1 | (mask1 << 8); mask1 = mask1 | (mask1 << 16); mask2 = mask2 | (mask2 << 8); mask2 = mask2 | (mask2 << 16); mask3 = mask3 | (mask3 << 8); mask3 = mask3 | (mask3 << 16); result = (x & mask1) + ((x >> 1) & mask1); result = (result & mask2) + ((result >> 2) & mask2); result = (result & mask3) + ((result >> 4) & mask3); return (result + (result >> 8) + (result >> 16) + (result >> 24)) & 0xff; } ``` #### int bitMask ```clike= int bitMask(int highbit, int lowbit) { int mask = ~1; mask = mask << highbit; mask = ~mask; int l = 1 << lowbit; l = l + (~1 + 1); int mask1 = mask & ~l; return mask1; } ``` #### int bitMatch ```clike= int bitMatch(int x, int y) { int a = x & y; int b = (~x & ~y); return ~(~a & ~b); } ``` #### int bitNor ```clike= return (~x & ~y); ``` #### int bitOr ```clike= return ~(~x & ~y); ``` #### int bitParity ```clike= int bitParity(int x) { int i, y; y = 0x01; for (i = 0; i <= 30; i++) { x = x ^ (x >> 1); } x = x & y; return x; } ``` #### int bitReverse ```clike= int bitReverse(int x) { uint32_t n = x; n = ((n & 0xffff0000) >> 16) | ((n & 0x0000ffff) << 16); n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8); n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4); n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2); n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1); return n; } ``` #### int bitXor ```clike= int bitXor(int x, int y) { return ~(~x & ~y) & (~(x & y)); } ``` #### int byteSwap ```clike= int byteSwap(int x, int n, int m) { int y = 0; n = n << 3; // n == n*3 m = m << 3; // m == n*3 y = 0xff & ((x >> n) ^ (x >> m)); // 1111 1111 x = x ^ (y << n); x = x ^ (y << m); return x; } ``` #### int conditional ```clike= int conditional(int x, int y, int z) { int f, g, h; f = !x; g = (~f) + 1; h = ~g; return (z & g) + (y & h); } ``` #### int countLeadingZero ```clike= int countLeadingZero(int x) { x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >> 16); x = ~x; int mask1 = 0x55; int mask2 = 0x33; int mask3 = 0x0F; int result = 0; mask1 = mask1 | (mask1 << 8); mask1 = mask1 | (mask1 << 16); mask2 = mask2 | (mask2 << 8); mask2 = mask2 | (mask2 << 16); mask3 = mask3 | (mask3 << 8); mask3 = mask3 | (mask3 << 16); result = (x & mask1) + ((x >> 1) & mask1); result = (result & mask2) + ((result >> 2) & mask2); result = (result & mask3) + ((result >> 4) & mask3); return (result + (result >> 8) + (result >> 16) + (result >> 24)) & 0xff; } ``` #### int copyLSB ```clike= int copyLSB(int x) { int i; x=x&0x01; for(i=0;i<=32;i++){ x=x|x<<1; } return x; } ``` #### int distinctNegation ```clike= return !!(x+x); ``` #### int dividePower2 ```clike= int dividePower2(int x, int n) { int flag = !(x & (1 << 31)); x = x + (1 << (n & (~0 + flag))) + ~0; return x >> n; } ``` #### int evenBits ```clike= int evenBits(void) { int mask = 0x55 | 0x55 << 8; mask = mask | 0x55 << 16 ; mask = mask | 0x55 << 24; return mask; } ``` #### int ezThreeFourths ```clike= int ezThreeFourths(int x) { int a = (x << 1) + x; //a = x * 3; int y = !!(a & (0x1 << 31)); int b = a + (0x3 & (y | y << 1)); return b >> 2; } ``` #### int fitsBits ```clike= ``` # 目前進度 ```coffeescript= ...Gives 42[0x2a]. Should be -2147483648[0x80000000] ERROR: Test satMul2(-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be -2147483648[0x80000000] ERROR: Test satMul3(-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be -2147483648[0x80000000] ERROR: Test sign(-2147483647[0x80000001]) failed... ...Gives 42[0x2a]. Should be -1[0xffffffff] ERROR: Test signMag2TwosComp(-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be 0[0x0] ERROR: Test specialBits() failed... ...Gives 42[0x2a]. Should be -3522561[0xffca3fff] ERROR: Test subtractionOK(-2147483648[0x80000000],-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be 1[0x1] ERROR: Test thirdBits() failed... ...Gives 42[0x2a]. Should be 1227133513[0x49249249] ERROR: Test tmax() failed... ...Gives 42[0x2a]. Should be 2147483647[0x7fffffff] ERROR: Test tmin() failed... ...Gives 42[0x2a]. Should be -2147483648[0x80000000] ERROR: Test trueFiveEighths(-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be -1342177280[0xb0000000] ERROR: Test trueThreeFourths(-2147483648[0x80000000]) failed... ...Gives 42[0x2a]. Should be -1610612736[0xa0000000] ERROR: Test twosComp2SignMag(-2147483647[0x80000001]) failed... ...Gives 42[0x2a]. Should be -1[0xffffffff] ERROR: Test upperBits(0[0x0]) failed... ...Gives 42[0x2a]. Should be 0[0x0] Total points: 61/228 ```