Test Message

d681: BinaryCount

內容

對一個二進位的數字每一個位元進行 & 、| 運算

運算規則如下

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0


輸入

輸入為一個二進位字串加上運算子 and 或 or

輸入的二進位字串<32 (5 bit)

且保證每個二進位字串長度一樣(5bit)

在每一行的最後會有一個空白

例如

10001 or 10000 and 11101 and 01001

  ^   ^    ^    ^    ^    ^    ^

依序是一個運算元+空白+運算子+空白+運算元+…最後是運算元+一個空白

每個運算元的長度都是 5bit ,但不一定都是 5 個運算元+4 個運算子

10001 or 10000 and 11101 and 01001
10111 or 10111 or 10010 or 00101
01000 and 01001 or 10011 and 11101
10111 and 00011 or 10010 or 11011
01001 and 10110 or 10010 and 11101

輸出

10001||10000&&11101&&01001 = 00001
10111||10111||10010||00101 = 10111
01000&&01001||10011&&11101 = 11001
10111&&00011||10010||11011 = 11011
01001&&10110||10010&&11101 = 10000


解題思路

整數型態比較好做位元運算,但輸出要把 input 格式化後重新輸出一遍,所以再將輸入的 2 進制字串轉換成整數做位元運算的同時順便做格式化存到 output,讀取到 input 字串結束後將得到解結果字串化進 output 輸出即可。


完整程式碼

AC (5ms, 72KB)
#include <stdio.h>

int ans, tmp;
char input[1100], output[1100], * iTop, * oTop;

void getBin(int* src)
{
*src = 0;
for (int i = 4; ~i; i--)
{
*src += ((*iTop - '0') << i);
*oTop++ = *iTop++;
}
}

int main()
{
while (gets(input))
{
iTop = input, oTop = output, getBin(&ans);
for (;;)
{
if (iTop[1] == 'o')
{
iTop += 4;
*oTop++ = '|', * oTop++ = '|';
getBin(&tmp);
ans |= tmp;
}
else if (iTop[1] == 'a')
{
iTop += 5;
*oTop++ = '&', * oTop++ = '&';
getBin(&tmp);
ans &= tmp;
}
else break;
}
*oTop++ = ' ', * oTop++ = '=', * oTop++ = ' ';
for (int i = 0; i < 5; i++)
* oTop++ = ((ans >> (4 - i)) & 1) + '0';
*oTop = '\0';
puts(output);
}
return 0;
}