# 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
```