使用C语言将十进制数转换为8位二进制并实现偶校验的问题咨询
实现方案
偶校验要求二进制序列中1的总个数为偶数,我们先统计8位数据位中1的个数,若个数为奇数则偶校验位设为1,否则设为0,以下是修改后的可直接运行的完整代码:
#include <stdio.h> #if defined(__LP64__) || defined(_LP64) # define BUILD_64 1 #endif #ifdef BUILD_64 # define BITS_PER_LONG 64 #else # define BITS_PER_LONG 32 #endif char *binstr (unsigned long n, size_t sz); // 计算偶校验位 int get_even_parity(unsigned long n, size_t sz); int main (void) { int n; printf("Enter the decimal number : "); scanf("%d",&n); // 仅取低8位,避免输入超出8位范围导致输出异常 unsigned char val = n & 0xFF; char *data_bin = binstr(val, 8); int parity_bit = get_even_parity(val, 8); printf("8位原始二进制:%s\n", data_bin); printf("偶校验位:%d\n", parity_bit); printf("带偶校验的完整序列(8位数据+1位校验位):%s%d\n", data_bin, parity_bit); return 0; } /* 返回n的固定sz位零填充二进制串 */ char *binstr (unsigned long n, size_t sz) { static char s[BITS_PER_LONG + 1] = {0}; char *p = s + BITS_PER_LONG; register size_t i; // 移除原逻辑中n为0时返回单字符的分支,保证固定输出sz位长度 for (i = 0; i < sz; i++) *(--p) = (n>>i & 1) ? '1' : '0'; return p; } // 统计sz位二进制中1的个数,返回偶校验位 int get_even_parity(unsigned long n, size_t sz) { int one_count = 0; for(size_t i = 0; i < sz; i++) { if(n >> i & 1) one_count++; } return one_count % 2; }
修改说明
- 修复了原
binstr函数输入为0时返回单字符0而非固定长度零填充串的问题,确保始终输出8位标准二进制 - 新增校验位计算逻辑,可直接输出校验位和带校验的完整序列
- 增加输入数值的低8位截取逻辑,兼容超过8位范围的输入值
如果需要把校验位整合到8位二进制中作为最高位,只需把原数据截取为低7位,将校验位放到第8位即可。
内容的提问来源于stack exchange,提问作者Akshat Pattiwar
相关产品推荐
相关产品推荐

