信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。

1、奇偶校验的常规方法:

unsigned int v; //待检测的数字bool parity = false; //初始判断标记while(v)

{

parity= !parity;

v= v & (v - 1);

}

通过while循环,每执行一次,v中1的数目就会减少1,如果v中1的数目为奇数,则parity=true,否则parity=false。

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 charb;bool parity = ParityTable256[b];

而对于32-bit的数,则使用下面的代码:

unsigned intv;

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

00000000

00000100

11010010

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位的数中,然后查表即可

3、使用64位乘法与模除法进行奇偶校验

unsigned char b;

bool parity =

(((b * 0x0101010101010101

原理:

0x0101010101010101ULL://00000001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001

0x8040201008040201ULL://1000 0000 0100 0000 0010 0000 0001 0000 0000 1000 0000 0100 0000 0010 0000 0001

0x1FF:  //0001 1111 1111

b * 0x0101010101010101ULL  将1~8位设置为b的二进制比特位,

c语言取位,C语言位操作相关推荐

  1. 计算机c语言运算符号取整,c语言取整(c语言四舍五入取整)

    C语言有以下几种取整方法:1. 直接赋值给整数变量.如:int i = 2.5: 或 i = (int) 2.5: 这种方法采用的是舍去小数部分2. 使用floor函数.floor(x)返回的是小于或 ...

  2. c语言怎么对大数求余,c语言取余数(c语言怎么求两数的余数)

    C语言提供了一个取余数的运算符%,称之为"模"运算符.只有两个整数之间才可以进行模运算!a % b 表示 用b来整除a,商整数,得到余数.如:5%3 = 2 4%3 =13%3 . ...

  3. c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...

    // c primer plus上的内容,位运算 #include char * itobs (int n,char * ps); void show_bstr(const char *); int ...

  4. 结构体运算符与取余_c语言取余(c语言去整和取余)

    1.1%12 == 1, 3%8 == 3;2.% 为取余运算,符号由被除数决定 e.g. -7%4 == - 3, 7%(-4) == 3, -7%(-4) == -3; C语言提供了一个取余数的运 ...

  5. 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用​​​​​​​2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)

    1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...

  6. c语言取字符数组最后几位

    c语言取字符数组最后几位 #include<stdio.h>int main (){char s[] = "123253426" ;char *t = &s[2 ...

  7. 怎样用c语言定义高幂整数,位操作运算的奇技淫巧!(附源码)

    位运算 百度百科如下: 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算就是直接对整数在内存中的二进制位进行操作 位操作的优势 位运算是一种底层的运算,往往比我们普通的运算要快上许多许多 ...

  8. C语言中位运算符有哪些

    C语言中位运算符有: 位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运 ...

  9. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

最新文章

  1. Spring MVC RedirectAttributes的用法解决办法
  2. 2020 年终总结:变化 积累
  3. jmeter持续集成测试中mongodb版本问题
  4. mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
  5. 程序员怎么看待C语言?最伟大?最落后?
  6. Ajax_Apache访问资源文件的权限配置、资源存放路径配置、配置虚拟主机、动态网站静态网站区别...
  7. APK反编译之APKTOOL的使用
  8. 非局部均值(Nonlocal-Mean)
  9. cojs EX_香蕉 题解报告
  10. ArcGIS水文分析实战教程(6)河流提取与河网分级
  11. 第十二章 演员评论家(Actor-Critic)-强化学习理论学习与代码实现(强化学习导论第二版)
  12. 计算机逻辑判断函数函数知识点,逻辑判断函数
  13. Cfree-5各种抽风解决办法
  14. python中re.compile()用法详解
  15. 豫科技版计算机七年级上册,七年级下册信息技术教案第一单元第一课《制作新春灯笼》豫科技版.doc...
  16. EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
  17. liferay portal 中文安装指南
  18. 【论文阅读】An LSTM-Based Deep Learning Approach for Classifying Malicious Traffic at the Packet Level
  19. 价格奥秘-在超市遇见亚当斯密--第二章 谁在决定一支铅笔的价格?
  20. 图像的采样与量化像素的空间关系图像文件的类型—数字图像处理

热门文章

  1. 数学界“诺奖”阿贝尔奖揭晓,颁给数学与计算机交叉学科,奖金约合575万元...
  2. 对对碰 代码 android,iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码...
  3. 创维电视天赐系统成功安装第三方应用教程
  4. 2023年pmp的考试时间是什么时候?(含pmp资料)
  5. snmptrap使用
  6. SAP770系统FI模块配置(定义信贷控制范围)
  7. C 语言程序的执行流程
  8. 今天试着用原生axios以及jquery下的axios请求数据
  9. python初级教练员考试题目_python程序设计(杨梅)-中国大学mooc-试题题目及答案...
  10. 运输公司对用户计算运输费用。