c语言取位,C语言位操作
信息是以比特流的方式传输的,类似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语言位操作相关推荐
- 计算机c语言运算符号取整,c语言取整(c语言四舍五入取整)
C语言有以下几种取整方法:1. 直接赋值给整数变量.如:int i = 2.5: 或 i = (int) 2.5: 这种方法采用的是舍去小数部分2. 使用floor函数.floor(x)返回的是小于或 ...
- c语言怎么对大数求余,c语言取余数(c语言怎么求两数的余数)
C语言提供了一个取余数的运算符%,称之为"模"运算符.只有两个整数之间才可以进行模运算!a % b 表示 用b来整除a,商整数,得到余数.如:5%3 = 2 4%3 =13%3 . ...
- c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...
// c primer plus上的内容,位运算 #include char * itobs (int n,char * ps); void show_bstr(const char *); int ...
- 结构体运算符与取余_c语言取余(c语言去整和取余)
1.1%12 == 1, 3%8 == 3;2.% 为取余运算,符号由被除数决定 e.g. -7%4 == - 3, 7%(-4) == 3, -7%(-4) == -3; C语言提供了一个取余数的运 ...
- 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)
1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...
- c语言取字符数组最后几位
c语言取字符数组最后几位 #include<stdio.h>int main (){char s[] = "123253426" ;char *t = &s[2 ...
- 怎样用c语言定义高幂整数,位操作运算的奇技淫巧!(附源码)
位运算 百度百科如下: 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算就是直接对整数在内存中的二进制位进行操作 位操作的优势 位运算是一种底层的运算,往往比我们普通的运算要快上许多许多 ...
- C语言中位运算符有哪些
C语言中位运算符有: 位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运 ...
- c语言位运算负数的实例_一招教你学会C语言中位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...
最新文章
- Spring MVC RedirectAttributes的用法解决办法
- 2020 年终总结:变化 积累
- jmeter持续集成测试中mongodb版本问题
- mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
- 程序员怎么看待C语言?最伟大?最落后?
- Ajax_Apache访问资源文件的权限配置、资源存放路径配置、配置虚拟主机、动态网站静态网站区别...
- APK反编译之APKTOOL的使用
- 非局部均值(Nonlocal-Mean)
- cojs EX_香蕉 题解报告
- ArcGIS水文分析实战教程(6)河流提取与河网分级
- 第十二章 演员评论家(Actor-Critic)-强化学习理论学习与代码实现(强化学习导论第二版)
- 计算机逻辑判断函数函数知识点,逻辑判断函数
- Cfree-5各种抽风解决办法
- python中re.compile()用法详解
- 豫科技版计算机七年级上册,七年级下册信息技术教案第一单元第一课《制作新春灯笼》豫科技版.doc...
- EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
- liferay portal 中文安装指南
- 【论文阅读】An LSTM-Based Deep Learning Approach for Classifying Malicious Traffic at the Packet Level
- 价格奥秘-在超市遇见亚当斯密--第二章 谁在决定一支铅笔的价格?
- 图像的采样与量化像素的空间关系图像文件的类型—数字图像处理
热门文章
- 数学界“诺奖”阿贝尔奖揭晓,颁给数学与计算机交叉学科,奖金约合575万元...
- 对对碰 代码 android,iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码...
- 创维电视天赐系统成功安装第三方应用教程
- 2023年pmp的考试时间是什么时候?(含pmp资料)
- snmptrap使用
- SAP770系统FI模块配置(定义信贷控制范围)
- C 语言程序的执行流程
- 今天试着用原生axios以及jquery下的axios请求数据
- python初级教练员考试题目_python程序设计(杨梅)-中国大学mooc-试题题目及答案...
- 运输公司对用户计算运输费用。