#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
int iParity = 0;
int bitmask = 0;
for (int i = 1; i < strlen(argv[1]); i ) {
switch (argv[1][i]) {
case '0':
if (iParity == 0)
iParity = 0;
else
iParity = 1;
break;
case '1':
if (iParity == 0)
iParity = 1;
else
iParity = 0;
break;
default:
break;
}
}
printf("The parity is: %d", iParity);
}
}
基本上我將輸入直接放入執行行,例如./check 10010,檢查是程式的名稱,然后我需要輸入二進制數,我需要使用位移(<<或>>)對數字進行奇偶校驗,我不應該使用“ xor”運算子,有沒有辦法在沒有很長代碼的情況下做到這一點?
uj5u.com熱心網友回復:
這里有2個不使用exclusive的解決方案:
您可以直接從字串表示中添加位值并用于&選擇結果的奇偶校驗:
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
const char *s = argv[1];
int iParity = 0 >> 0; // required bitshift :)
for (int i = 0; p[i] != '\0'; i ) {
iParity = p[i] == '1';
}
iParity &= 1;
printf("The parity is: %d\n", iParity);
}
return 0;
}
您的老師可能會期待另一種方法,將數字從文本轉換為整數并從其位計算奇偶校驗:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
// convert from base 2 text representation
unsigned long number = strtoul(argv[1], NULL, 2);
int iParity = 0;
while (number != 0) {
iParity = number & 1;
number = number >> 1;
}
iParity &= 1;
printf("The parity is: %d\n", iParity);
}
return 0;
}
uj5u.com熱心網友回復:
非常天真 - 但沒有異或
int verynaive(uint32_t v)
{
int result = 0;
while(v)
{
result = v & 1;
v >>= 1;
}
return result & 1;
}
我知道的最快的方法是使用查找表。
int parity(uint32_t v)
{
uint16_t lookup = 0b110100110010110;
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
return (lookup >> (v & 0x0f)) & 1;
}
或者更天真一點
int func( uint32_t x )
{
int32_t y;
for ( y=0; x; y = !y )
x ^= x & -x;
return y;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361341.html
上一篇:C中的迭代交叉和
下一篇:HAproxySSL握手失敗
