用c语言实现奇偶校验
来源:互联网 发布:大数据测试的工具简介 编辑:程序博客网 时间:2024/06/10 16:47
1、用c语言实现奇偶校验
unsigned int v; // 待检测的数字bool parity = false; //初始判断标记while (v){ parity = !parity; v = v & (v - 1);}2、通过构建字典表进行奇偶校验:
static const bool ParityTable256[256] =
{
# define P2(n) n, n^1, n^1, n
# define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)
# define P6(n) P4(n), P4(n^1), P4(n^1), P4(n)
P6(0), P6(1), P6(1), P6(0)
};
通过嵌套宏定义,制作一张包括0~255各个数字中包含1的个数,其中包含偶数个1,则ParityTable256[i]=0,否则ParityTable256[i]=1;
如果要判定char类型的b中i的个数的奇偶,可以直接使用下面的代码:
unsigned char b;
bool parity = ParityTable256[b];
而对于32-bit的数,则使用下面的代码:
unsigned int v;
v ^= v >> 16;
v ^= v >> 8;
bool parity = ParityTable256[v & 0xff];
原理:
(1)通过v^=v>>16,将v中的低16位与高16位进行按位或(^)操作, 相当于0~16位保留1的总个数的奇偶与v中的1的总 个数的奇偶相同;
(2)通过v^=v>>8,将v中的9~16位与0~8位进行按位或(^)操作,相当于0~8位保留1的总个数的奇偶与0~16中1的总个数的奇偶相同;
(3)通过(1)(2)操作,最初v中1的总个数的奇偶与最后v中1~8位中1的总个数的奇偶相同,v&0xff相当于获取v中1~8比特位的1,然后再查表即可。
或者使用如下的代码:
unsigned char * p = (unsigned char *) &v;
parity = ParityTable256[p[0] ^ p[1] ^ p[2] ^ p[3]];
原理:取v的地址,并进行强制类型转换为char*,
e.g. v=1234
二进制表示为:
00000000 000000000000010011010010
p[0]:11010010
p[1]:00000100
p[2]:00000000
p[3]:00000000
^------------
11010110
通过p[0] ^ p[1] ^ p[2] ^ p[3]] 操作,将p[i]中的所有的1都放在一个8位的数中,然后查表即可
0 0
- 用c语言实现奇偶校验
- C语言位操作--奇偶校验算法
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- 奇偶校验
- POJ1741树的分治之点分治
- noip模拟题11.10 光棍节前夕
- 11-框架标签
- 64位Win7下VS2010使用OpenCV2.4.11
- the super tiny vue.js(源码不超过200行)
- 用c语言实现奇偶校验
- 网络编程基础知识
- [Usaco14Mar] Sabotage
- 生活日常
- pat-bl-1012
- 阿里云双十一大降价
- Ubuntu下sublime中无法输入中文的解决方案
- Learning Entity and Relation Embeddings for Knowledge Graph Completion
- c语言 补码原码换算