You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:06:04