奇偶校验_函数奇偶性八字口诀

奇偶校验_函数奇偶性八字口诀1、奇偶校验 奇偶校验是一种差错技术,简单的来说说就是统计一个或一组数据里面1的个数,然后添加一位校验码,使数据里面1的个数总数为奇数或偶数。最终1的个数是偶数的是偶校验,1的个数是奇数的是奇校验。 奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误时必须扔

奇偶校验_函数奇偶性八字口诀"

1、奇偶校验

奇偶校验是一种差错技术,简单的来说说就是统计一个或一组数据里面1的个数,然后添加一位校验码,使数据里面1的个数总数为奇数或偶数。最终1的个数是偶数的是偶校验,1的个数是奇数的是奇校验。

奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误时必须扔掉全部的数据,然后从头开始传输数据。奇偶校验对2个错误位的情况也无法判处,出现负负得正的结果。

有些场景对字节类型数据的奇偶校验使用前7位表示数据,最低位表示奇偶校验标记,如下标所示。

原始数据 1的个数 奇校验码 偶校验码
10111010 5 10111010 10111011
11010010 4 11010011 11010010

2、计算方法

根据奇偶校验的定义,计算奇偶校验的本质就是统计1的个数,然后在尾数上补1或补0。

如果是奇校验,当数据里面的”1″的个数为奇数个时,不需要改动即在最后添0,为偶数个添1使“1”的总数为奇数个。偶校验逻辑刚好相反。

2.1对1出现的次数进行计数

uint8_t parity_set(uint8_t data, bool is_even)  
{
    int cnt = 0;
​
    uint8_t tmp = data >> 1;
​
    for (int i = 0; i < 7; i++)
    {
        if ((tmp >> i) & 0x01) {
            cnt++;
        }
    }
​
    if (is_even && (cnt % 2 == 1)) {
        data |= 0x01;
    }
    else if (!is_even && (cnt % 2 == 0)) {
        data |= 0x01;
    }
​
    return data;
}

2.2对1出现的次数进行奇偶交替标记

例如:1111 0000 : 奇-偶-奇-偶, 结果为偶数个。如果奇校验就补1,偶校验就补0。

uint8_t parity_set(uint8_t data, bool is_even)
{
    int cnt = 0;
    int p = 0;
​
    uint8_t tmp = data >> 1;
​
    for (int i = 0; i < 7; i++)
    {
        if ((tmp >> i) & 0x01) {
            p = 1 - p;
        }
    }
    data = (data & 0xFE) | (is_even ? p : (1 - p));
​
    return data;
}

2.3使用按位异或

对包含奇数个1的数据两两按位异或之后一定为1,偶数个1的数据按位异或后一定为0,基于这个原理,可以把for循环改写提高效率。

uint8_t parity_set(uint8_t data, bool is_even)
{
    int cnt = 0;
    int p = 0;
​
    uint8_t tmp = data >> 1;
​
    if (tmp != 0) {
        tmp ^= tmp >> 4;
        tmp ^= tmp >> 2;
        tmp ^= tmp >> 1;
        tmp &= 1;
    }
​
    data = (data & 0xFE) | (is_even ? tmp : (1 - tmp));
​
    return data;
}

 

 

今天的文章奇偶校验_函数奇偶性八字口诀分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/50282.html

(0)
编程小号编程小号
上一篇 2023-09-02
下一篇 2023-09-02

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注