c语言第12章位运算

合集下载

c语言的位操作

c语言的位操作

c语⾔的位操作c语⾔的位操作最常⽤的地⽅就是⽤在对寄存器的写值上。

⼀.基本的⼀些概念 1.位与:&操作:1 & 1 = 1; 1 & 0 = 0; 0 & 0 = 0;特点:只有全是1的时候才是1,其他情况都是0.总结:任何数和0位与就是0,和1位与没有变化,所以位与常⽤在清零上(清零⽤位与)。

2.位或:|操作:1 | 1 = 1; 1 | 0 = 1; 0 | 0 = 0;特点:只有全0的时候才是0,其他情况都是1.总结:任何数和1位或就是1,和0位或没有变化,所以位或常⽤在置1上(置1⽤位或)。

3.位取反:~操作:~1 = 0; ~0 = 1;特点:1取反为0,0取反为1. 4.位异或:^操作:1 ^ 1 = 0; 1 ^ 0 = 1; 0 ^ 1 = 1; 0 ^ 0 = 0;特点:相同为0,不同为1.总结:任何数和1位异或会取反,和0异或没有变化(特定位要取反就⽤位异或)。

5.左移(<<)和右移(>>)操作的时候要考虑有符号数(signed number)和⽆符号数(unsigned number)。

对于有符号数:左移的时候右侧补0;右移的时候左侧补符号位(正数符号位为0,则补0;负数符号位为1,则补1).对于⽆符号数:左移的时候右侧补0;右移的时候左侧也是补0.注意:我们对寄存器进⾏赋值的时候⽤的都是⽆符号的数⼆.与逻辑运算的区别 1.逻辑运算的基本符号:逻辑与(&&) 逻辑或(||) 逻辑取反(!) 2.我们需要注意的地⽅就是:位操作中只有1和0;逻辑操作的中⾮0代表是真(1),0就代表是假(0) 3.运算的时候,位运算是把数字拆为⼀位⼀位的进⾏运算的;逻辑运算是把数字作为⼀个整体进⾏运算的,但是他们运算的基本操作和位运算⼀致(譬如:1 && 1 = 1, 0 && 1 = 0 等等)。

C语言位运算

C语言位运算

第8章位运算C语言是为描述系统而设计的,与其它高级语言相比,它的一个重要特点是具有汇编语言的功能,这主要表现在C语言提供了特有的位运算功能。

8.1 位运算概念C语言的位运算是指在C语言中能进行二进制位的运算。

位运算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。

为了表示数值,可以采用不同的方法,一般有:原码、反码和补码。

计算机内部是以补码形式存放数值的。

8.2 位运算符C语言提供了六种位运算,如表8-1所示。

表8-1 位运算符及含义说明:1.位运算量a,b只能是整型或字符型的数据,不能为实型数据。

2.位运算符中除按位取反运算符~为单目运算符外,其它均为双目运算符,即要求运算符的两侧各有一个运算量。

8.2.1位逻辑运算符假设a,b为整型的数据,并且设a=123(等于二进制数00000000001111011),b=152(等于二进制数00000000010011000)1.“按位与”运算符&运算规则:参加运算的两个运算量,如果两个数相应位的值都是1,则该位的结果值为1,否则为0。

即:0 & 0 =0;0 & 1 =0;1 & 0 =0;1 & 1 =1。

【例8-1】a的补码:00000000001111011b的补码:00000000010011000& ————————结果的补码:00000000000011000即:a&b=0x18。

2.“按位或”运算符|运算规则:参加运算的两个运算量,如果两个数相应位的值都是0,则该位的结果值为0,否则为1。

即:0 | 0 =0;0 | 1 =1;1 | 0 =1;1 | 1 =1【例8-2】a的补码:00000000001111011b的补码:00000000010011000| ————————结果的补码:00000000011111011即:a|b=0xfb。

第12章 c语言位运算.ppt

第12章 c语言位运算.ppt

unsigned half_carry: 1; /*半进位标志*/
unsigned negative: 1; /*减标志*/
} flags;
显然,对CPU的状态寄存器而言,使用位段类型(仅需1 个字节),比使用结构类型(需要6个字节)节省了5个 字节。
定义位段的一般格式 struct [结构类型名]
76543210
图11-1 1个字节各二进制位的编号 2.数值的原码表示 数值的原码表示是指,将最高位用作符号位(0表示正 数,1表示负数),其余各位代表数值本身的绝对值(以二 进制形式表示)的表示形式。为简化描述起见,本节约定
用1个字节表示1个整数。
例如,+9的原码是00001001
└→符号位上的0表示正数 -9的原码是10001001。
main()
{ int num, mask, i;
printf("Input a integer number: ");
scanf("%d",&num);
mask = 1<<15; /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/
printf("%d=" , num);
for(i=1; i<=16; i++)
/*案例代码文件名:AL12_1.C*/ /*程序功能:输出一个整数中由8~11位构成的 数*/ main()
{ int num, mask; printf("Input a integer number: "); scanf("%d",&num); num >>= 8; /*右移8位,将8~11位移到低4位上*/ mask = ~ ( ~0 << 4); /*间接构造1个低4位为1、其

C语言中的位运算的技巧

C语言中的位运算的技巧

C语⾔中的位运算的技巧⼀、位运算实例1、⽤⼀个表达式,判断⼀个数X是否是2的N次⽅(2,4,8,16.....),不可⽤循环语句。

X:2,4,8,16转化成⼆进制是10,100,1000,10000。

如果减1则变成01,011,0111,01111。

两者做按位与运算,结果如果为0,则X是2的N次⽅。

2、统计⼀个整数的⼆进制中1的个数int count_number_of_one(int number){ int counter = 0; while (number) { counter++; number &= number - 1 ; } return counter;}⼆、位运算基础很多⾼级的动态规划题⽬或者⼀些基础的运算往往需要较⾼的执⾏效率和较低的空间需求,或者需要表⽰⼀些状态集合,⽽位运算刚好能满⾜这⼀切。

很多的时候,恰当的位运算使⽤也能使程序变得更加简洁和优美。

1、位运算法则位运算是各位互不影响的,⽐如A为1010⽽B为1100,那么有A&B=1000A|B=1110A^B=0110~A=11110101 (1的个数是取决于A的类型的,这⾥认为A的类型是8位整型)另外两种位运算是位移运算a<<b,a>>b。

前者表⽰将a的所有位向左移动b位,后者则表⽰将a的所有位向右移动b位。

对于⾮负整数(往往这也是我们最关⼼的),新空出的位将会被0取代。

⽐如A为1001,⽽B为3,那么A>>B则为1。

⼤多数情况下可以简单地认为左移b位就是乘以2b,⽽右移b位则是除以(整除)2b。

当然这是存在例外的——对于负数是不能这么简单认为的:⽐如在GNU GCC/G++ 编译条件下,若A=-1,你会发现对于任何位移运算A<<B,⽆论B的取值如何,其结果均为-1。

因此请注意,在位移运算下务必确保对⾮负整数进⾏运算,以免发⽣不必要的问题。

对于位移运算最常⽤的操作就是取⼀个特定的位——⽐如1< xx>2、对于集合的表⽰⼤多数时候,我们可以⽤⼀个整数来表⽰⼀个包含不超过32(当然如果使⽤64位整型变量也可以是64个)个元素的集合——对于每⼀个位,如果元素为1,则表⽰存在当前位所对应的集合成员,如果是0,则表⽰这个集合成员是不存在的。

C语言新教材PPT课堂课件第12章位运算

C语言新教材PPT课堂课件第12章位运算
| 1001 ────
1011=11 (3)主要用途:将1个数的某(些)位置1,其余各位不变。
3.按位异或── ^ (1)格式:x^y (2)规则:对应位相同时为0,不同时为1:3^9=10。 例如,3^9=1: 0011
^ 1001
────
1010=10 (3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0 的变为1),其余各位不变。 4.按位取反── ~ (1)格式:~x (2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1: 在IBM-PC机中,~0=0xffff,~9=0xfff6。 (3)主要用途:间接地构造一个数,以增强程序的可移植性。 5.按位左移── << (1)格式:x<< 位数 (2)规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。
程序运行情况:
Input a integer number:1000 ←┘
result=0x3
程序说明:~ ( ~0 << 4)按位取0的反,为全1;左移4位后,其低4位为0,其 余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们 所需要的。
[例12.2] 从键盘上输入1个正整数给int变量num,按二进制位输 出该数。
printf("Input a integer number: ");
scanf("%d",&num);
num >>= 8;
/*右移8位,将8~15位移到低8位上*/
mask = ~ ( ~0 << 4);/*间接构造1个低4位为1、其余各位为0的整数*/
printf("result=0x%x\n", num & mask); }

C语言之位运算

C语言之位运算
学生分析:
学生学习过简单的二进制运算,对详细的位运算不熟悉,应注重入门引导。
教学重点:
位运算的概念及分类。实例解释及分析对比,掌握各种运算的规则。
教学难点:
位运算及其应用。通过实例讲解及应用,启思诱导。
【教学方法】
讲授法、演示法:多媒体课件讲授、配合板书。
任务驱动法:从实例入手,先实际后理论。
【教学过程】
【算法分析】:要求将a进行循环移动,即进行如下操作:
(1)将a的右端n位先放到b中的高n位中。
b=a<<(16-n)
(2)将a右移n位,其左面高位补0。
c=a>>n
(3)将c和b进行按位或运算。
c=c|b
程序如下:
main()
{
unsigned a,b,c;
int n;
scanf(“%o,%d”,&a,&n);
5’
位运算符是重点
对于注意问题应强调说明
规则仿照基本运算符的规则
二、位运算的概念
1.位运算的概念
位运算实际就是对表示计算机中的数进行操作的运算符。
/view/bf631c1fa8114431b90dd870.html
2.基本位运算符
位运算符的运算功能:
/depart/ncre/cprogram/frame/ce02.htm
10’
五、小结
C语言的位运算是指在C语言中能进行二进制位的运算。位运算包括位逻辑运算和移位运算,逻辑运算包括:按位与、按位或、按位异或、按位取反;移位运算包括:左移和右移。利用位运算可以完成汇编语言的功能,如判断一个数据的某一位是否为1;保留一个数据中的某些位;将一个数据的某些位置为1;将一个数据的某些位翻转等等。移位运算包括算术移位和逻辑移位。

C语言中的位运算

C语言中的位运算
那么,sLowBits1 与 sLowBits2 有什么区别?
注意了,sLowBits1 和 sLowBits2 都是 short 型(而不是 unsigned short), 所以在这里,sLowBits1 代表一个正数值,而 sLowBits2 却代表了一个负数值(因 为 8 即是二进制 1000,sLowBits2 最高位是 1)。
///////////////////////////////////////////////// int main() { short sHighBits1 = 0x7fff; short sHighBits2 = 0x8f12; unsigned short usHighBits3 = 0xff12; short sLowBits1 = 0x7bcd; long lResult = 0;
[sHighBits1 + sLowBits1] lResult = 7fff7bcd lResult = 8f127bcd lResult = ff127bcd
嗯,运行很正确嘛……于是我们就放心的在自己的程序中使用起这个函数来 了。
可是忽然有一天,我们的一个程序无论如何结果都不对!经过 n 个小时的检 查和调试,最后终于追踪到……CatenateBits16() !?它的返回值居然是错的!!
前一次还好好的,后一次就 ffff 了?X 档案?
[X 档案的真相]:
注意那两个我们用来当作低 16 位值的 sLowBits1 和 sLowBits2。
已知: 使用 sLowBits1 = 0x7bcd 时,函数返回正确的值; 使用 sLowBits2 = 0x8bcd 时,函数中发生 X 档案。
lResult = CatenateBits16(sHighBits2, sLowBits1); printf("lResult = %08x ", lResult, lResult);

c语言中的位运算

c语言中的位运算

c语言中的位运算位运算是计算机中常用的一种运算方式,它直接对二进制数的每一位进行操作。

在C语言中,位运算有多种操作符,包括位与(&)、位或(|)、位异或(^)、位取反(~)等。

本文将介绍位运算的基本概念和常见应用。

一、位与运算(&)位与运算是对两个操作数的每一位进行与操作,只有在两个操作数的对应位都为1时,结果的对应位才为1,否则为0。

位与运算常用于屏蔽某些位、清零某些位的操作。

例如,假设有一个8位的二进制数11101110,我们想将第4位和第5位清零,可以使用位与运算符来实现:```unsigned char num = 0xEE; // 二进制数11101110unsigned char mask = 0xCF; // 二进制数11001111 unsigned char result = num & mask; // 二进制数11001110```通过将原数与一个掩码进行位与运算,可以将指定位置零,得到结果11001110。

二、位或运算(|)位或运算是对两个操作数的每一位进行或操作,只要两个操作数的对应位中有一个为1,结果的对应位就为1,否则为0。

位或运算常用于设置某些位、将某些位置1的操作。

例如,假设有一个8位的二进制数00110011,我们想将第3位和第4位置1,可以使用位或运算符来实现:```unsigned char num = 0x33; // 二进制数00110011unsigned char mask = 0x0C; // 二进制数00001100 unsigned char result = num | mask; // 二进制数00111111```通过将原数与一个掩码进行位或运算,可以将指定位置1,得到结果00111111。

三、位异或运算(^)位异或运算是对两个操作数的每一位进行异或操作,当两个操作数的对应位相同时,结果的对应位为0,否则为1。

位异或运算常用于数据加密、数据校验等操作。

c语言程序设计第三版谭浩强第十二章位运算

c语言程序设计第三版谭浩强第十二章位运算

29
程序如下: 运行情况如下: #include <stdio.h> a=157653,n=3 void main() 15765 3 { unsigned a,b,c; 75765 int n; scanf(“a=%o,n=%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; 运行开始时输入八进制数157653 157653, 运行开始时输入八进制数157653, printf(“%o\n%o”,a,c); 即二进制数1101111110101011 即二进制数1101111110101011 } 循环右移3位后得二进制数0111101111110101 循环右移3位后得二进制数0111101111110101 即八进制数75765 即八进制数75765
14
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b =b∧a;”相当于b=b∧(a∧b)。 ② 再执行第三个赋值语句: a=a∧b。由于a的 值等于(a∧b),b的值等于(b∧a∧b), 因此,相当于a=a∧b∧b∧a∧b,即a的值等 于a∧a∧b∧b∧b,等于b。 a得到b原来的值。
9
应用:按位或运算常用来对一个数据的某 些位定值为1。例如:如果想使一个数a 的低4位改为1,只需将a与017进行 按位或运算即可。 例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。
10
12.1.3“异或”运算符( 12.1.3“异或”运算符(∧)
异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假) 异号则结果为1(真)
5
按位与的用途: 按位与的用途: (1) 清零

C语言位运算和sizeof运算符详解

C语言位运算和sizeof运算符详解

C语言位运算和sizeof运算符详解C语言位运算和sizeof运算符详解C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。

位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。

下面,就和店铺一起来看一看C语言位运算和sizeof运算符详解,希望对大家有帮助!位运算和sizeof运算符C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。

位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。

位运算主要有6种:与(&),或(|),取反(~),异或(^),左移(<<),右移(>>)。

1.位运算中的类型转换位运算都必须进行Integer Promotion。

在进行运算之前,都必须将char型、short型的数据转换为int或者unsigned int型再参与运算。

如下面这段程序:#include<stdio.h>int main(void){unsigned char c=0xfc;unsigned int i=~c;printf("0x%xn",i);return 0;}在对c取反之前,先将c提升为int型,则为0x000000fc,取反之后结果就是0xffffff03,所以程序输出结果是0xffffff03,而不是0x00000003.2.异或运算的.一些特性。

a^0=a,a^a=0这两个特性是异或运算最常用的特性。

利用这个特性可以不借助临时变量就可以交换两个整数#include<stdio.h>int main(void){int a=3;int b=2;a=a^b;b=a^b;a=a^b;printf("%d %dn",a,b);return 0;}不借助临时变量交换两个数据还可以用另外一种方法。

c语言位运算计算平方

c语言位运算计算平方

c语言位运算计算平方
摘要:
1.位运算概述
2.计算平方的传统方法
3.C 语言中的位运算
4.使用位运算计算平方
5.总结
正文:
1.位运算概述
位运算是指对二进制数的每一位进行操作的一种数学运算方法。

在计算机科学中,位运算被广泛应用于各种算法和数据结构中,因为它们可以大大提高程序的执行效率。

2.计算平方的传统方法
传统的计算平方的方法是将一个数乘以它本身。

例如,计算5 的平方,我们需要将5 乘以5,得到25。

3.C 语言中的位运算
在C 语言中,有四种基本的位运算:按位与(&)、按位或(|)、按位异或(^)和按位非(~)。

这四种运算可以组合使用,以实现对二进制数的各种操作。

4.使用位运算计算平方
对于一个整数n,我们可以使用位运算来计算它的平方。

具体步骤如下:
- 首先,将n 右移一位(即除以2),得到n/2。

- 然后,将n/2 与n 进行按位与运算,得到n/2 的结果。

- 接着,将n/2 左移一位(即乘以2),得到n/2*2。

- 最后,将n/2*2 与n 进行按位或运算,得到n 的平方。

5.总结
通过使用位运算,我们可以快速地计算一个整数的平方。

这种方法在计算机科学中非常有用,因为它可以减少程序的执行时间。

C语言中的位操作技巧

C语言中的位操作技巧

C语言中的位操作技巧在C语言中,位操作是一种非常强大且常用的技巧,可以通过对数据的二进制表示进行位运算来实现一些高效的操作。

在本文中,我们将介绍一些常见的C语言中的位操作技巧,帮助您更好地理解和应用这些技术。

首先,我们来介绍一些常见的位操作运算符及其作用。

在C语言中,有以下几种位操作运算符:1. 位与(&):将两个操作数的对应位都设置为1时,结果为1;否则结果为0。

2. 位或(|):将两个操作数的对应位中至少有一个为1时,结果为1;否则结果为0。

3. 位异或(^):将两个操作数的对应位不相同时,结果为1;否则结果为0。

4. 位取反(~):对操作数的每一位取反,即0变为1,1变为0。

利用这些位操作运算符,我们可以实现一些高效的位操作技巧。

例如,我们可以通过位与(&)运算来判断一个数的奇偶性。

如果一个数n为偶数,则n & 1的结果为0;如果n为奇数,则n & 1的结果为1。

这是因为奇数的二进制表示的最后一位为1,而偶数的二进制表示的最后一位为0。

另外,我们还可以通过位或(|)运算来设置某一位的值。

例如,我们可以通过将一个数num与一个掩码mask的对应位进行位或运算,来将num的某一位设置为1。

通过这种方式,我们可以实现对某一位的快速设置操作。

除了位与、位或、位异或和位取反运算符外,C语言还提供了一些位移操作符。

其中,左移(<<)操作符和右移(>>)操作符可以将一个数的二进制表示向左或向右移动指定的位数。

通过位移操作符,我们可以实现快速计算乘法和除法。

例如,左移操作符可以用来计算一个数乘以2的幂次方,右移操作符可以用来计算一个数除以2的幂次方。

这种快速计算乘法和除法的方法在某些场合下非常有用。

除了上述常见的位操作技巧外,还有一些更复杂的技巧可以通过位操作来实现。

例如,通过位操作可以实现对数组中元素的快速排序、去重和查找等操作。

此外,位操作还可以用来实现一些经典的算法,如哈弗曼编码、布隆过滤器等。

c语言位运算详解

c语言位运算详解
右移3位 00 00 1 1 1 1 00 00 0 0 0 1
图11.2 15右移3位得到1
右移1位相当于该数除以2,右移n位相当于该数除以2 n , 因此,将15右移3位,相当于15/2 3 = 1(C语言规定整数相 除商为整数)。
右移时应注意符号问题。对于无符号数,右移时左端补0。 对于有符号数,若符号位为0(该数为正),则右移时左端 补0,同无符号数的处理。若符号位为1(该数为负),则右 移时左端是补0还是补1,取决于所用的计算机系统。有的系 统左端补0,称逻辑右移;左端补1,称算术右移。显然,两 种方式所得的结果是不一样的。Turbo C采用的是算术右移。
scanf (”%u” , & a ) ;
b=a >> 4 ; b=b & 0x000F; printf (” \na=%u b=%u ”, a , b ) ; } 运行情况如下: 115
a=115,b=7
例 2 循环移位。要求将一个无符号数进行左循环移位。如 图11. 4所示。将a左移1位,并将移出位补到右端,输入′e ′结束。
(4)重复以上步骤,直到有键按下。程序如下:
# include <stdio. h> main( ) { unsigned a ; int flag ; scanf (”%u” , & a ) ; while (getchar( ) !=’ e ’ )
{
flag=a & 0x8000 ; a=a<<1 ;
关于位段数据,注意以下几点: (1)一个位段必须存储在同一存储单元(即字)之中,不能跨两 个单元。如果其单元空间不够,则剩余空间不用,从下一个 单元起存放该位段。 (2)可以通过定义长度为0的位段的方式使下一位段从下一存 储单元开始。 (3)可以定义无名位段。 (4)位段的长度不能大于存储单元的长度。

C语言位操作运算详解

C语言位操作运算详解

位运算程序中的所有数在计算机内存中都是以二进制的形式储存的。

位本文会以C语言的交互环境来做代码演示常见的二进制位的变换操作and运算 &•判断奇偶数对于除0以外的任意数x,使用x&1==1作为逻辑判断即可if (x&1==1){}•判断某个二进制位是否为1比如第7位, 0x40转到二进制是0100 0000,代表第7位是1.if (n&0x40){//TODO:添加你要处理的代码}•字节读取(x >> 0) & 0x000000ff /* 获取第0个字节*/(x >> 8) & 0x000000ff /* 获取第1个字节*/(x >> 16) & 0x000000ff /* 获取第2个字节*/(x >> 24) & 0x000000ff /* 获取第3个字节*/•判断一个数是不是 22 的指数bool isPowerOfTwo(int n) {if (n <= 0) return false;return (n & (n - 1)) == 0;}•取余//得到余数int Yu(int num,int n){int i = 1 << n;return num&(i-1);}•指定二进制位数截取比如说16位二进制数A:1001 1001 1001 1000,如果来你想获A 的哪一位的值,就把数字B:0000 0000 0000 0000的那一位设置为1.比如说我想获得A的第三位就把B的第三位数字设置为1,则B为0000 0000 0000 0100,设置完之后再把A、B求与,其结果若为0,说明A的第三位为0,其结果为1,说明A的第三位为1.同理:若要获得A的第五位,就把B设置为0000 0000 0001 0000,之后再求与。

通常在我们的程序中,数字B被称为掩码,其含义是专门用来测试某一位是否为0的数值。

c语言位运算符号

c语言位运算符号

C语言中的位运算符用于对二进制位进行操作。

以下是C语言中常用的位运算符:
1. 位与(&):如果两个操作数的对应位都为1,则结果位为1,否则为0。

例如:a & b
2. 位或(|):如果两个操作数的对应位中至少有一个为1,则结果位为1,否则为0。

例如:a | b
3. 位异或(^):如果两个操作数的对应位不相同,则结果位为1,否则为0。

例如:a ^ b
4. 位取反(~):对操作数的每个位进行取反,即0变为1,1变为0。

例如:~a
5. 左移(<<):将操作数的二进制位向左移动指定的位数,高位补0。

例如:a << n
6. 右移(>>):将操作数的二进制位向右移动指定的位数,低位补0(对于无符号数)或符号位(对于有符号数)。

例如:a >> n
位运算通常用于处理底层的二进制数据,如位编码、标志位的设置与清除等。

需要注意的是,在使用位运算时要注意数据类型的范围和符号的处理,以免出现意外的结果。

C语言第12章位运算法则

C语言第12章位运算法则
本章要求 1、位运算及其特殊用途。 2、信息的位段表示。
第 12 章 位运算 1/5
第 12 章 位运算
位运算: 是指对二进制按位进行运算。如:将一个二进制的位左移或右移,两个二进制数相加 等。
12.1 位运算
C 语言提供的位运算符: & 按位与 | 按位或 ∧ 按位异或 ~ 取反 << 左移 >> 右移
b=a<<(16-n);
c=a>>n;
cபைடு நூலகம்c|b;
printf(“%o\n%o”,a,c);
}
12.3 位域(位段)
信息可以用 1 字节、2 字节、4 字节、8 字节表示。 例如,用 1 字节表示一个英文字符,2 字节表示一个汉字字符,4 字节表示一个实数,....等。
第 12 章 位运算 4/5
|=, 例:a|=b 相当于 a=a|b
>>=, 例:a >>=b 相当于 a=a>>b
<<=, 例:a<<=b 相当于 a=a<<b
∧=, 例:a∧=b a = a∧b
12.2 位运算举例
例[12.1] 取一个整数 a 从右端开始的 4~7 位。 比如,
第 12 章 位运算 3/5
0000,0000,1101,1001(16 位二进制) 方法: (1) 先使 a 右移 4 位,使要取出的几位移到最右端。a>>4 (2) 设置一个低 4 位全为 1,其余为 0 的数
二、“按位或”运算符 规则: 参加运算的两个运算量,如果两个对应位中有 1,则 该位结果值为 1,否则为 0。 例如 X=10001001 Y=11101110

C语言位操作

C语言位操作

C语言位操作(转)在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。

一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。

C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。

位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移1. 按位与运算按位与运算符"&"是双目运算符。

其功能是参与运算的两数各对应的二进位相与。

只有对应的两个二进位均为1时,结果位才为1 ,否则为0。

参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。

例如把a 的高八位清 0 ,保留低八位,可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

应用:a. 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)b. 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)2. 按位或运算按位或运算符“|”是双目运算符。

其功能是参与运算的两数各对应的二进位相或。

只要对应的二个二进位有一个为1时,结果位就为1。

参与运算的两个数均以补码出现。

例如:9|5可写算式如下:00001001|0000010100001101 (十进制为13)可见9|5=13应用:常用来将源操作数某些位置1,其它位不变。

(mask中特定位置1,其它位为0 s=s|mask)3. 按位异或运算按位异或运算符“^”是双目运算符。

其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

c语言位运算

c语言位运算

c语言位运算C语言是一种多用途、面向过程的编程语言,位运算是C语言中非常重要的一种运算形式。

在这里,我们将介绍C语言中位运算的基本内容。

1. 位运算的概念位运算是对数据的每一位进行逻辑运算的一种方式,其中包括位逻辑运算和位移运算。

位运算的逻辑操作符一般由 & 、 | 、 ^ 、 ~符号表示,而位运算的移位操作符一般由 << 、 >>符号表示,它们分别表示左移、右移操作。

2. 位逻辑运算位逻辑运算是基于位操作的一种逻辑运算,对给定的两个比特串进行操作,如果比特串中有一位为1,那么逻辑运算结果就是1,如果比特串中所有位都为0,那么逻辑运算结果就是0。

C语言中最常用的位逻辑运算符有&(与)、|(或)、^(异或)、~(取反),它们的运算规则如下:(1)&(与运算):两个比特位均为1,结果才是1,否则结果为0。

(2)|(或运算):只要有一个比特位为1,结果即为1,否则结果为0。

(3)^(异或运算):两个比特位不同时,结果才是1,相同时结果为0。

(4)~(取反运算):对比特位求反,0变1,1变0。

3. 位移运算位移运算是一种特殊的位运算,它是指将数据在二进制表示中进行左右移动操作。

在C语言中,位移运算符一般用 << 、 >>示,其中表示左移,>>示右移。

左移运算是将数据的二进制表示整体向左移动,左边的位被舍弃,右边补0,而右移运算是将数据的二进制表示整体向右移动,右边的位被舍弃,左边补0。

4. 位运算的优势位运算具有速度快、效率高、不消耗资源等优势,所以在硬件领域以及一些操作系统方面的实时程序编程中,位运算是不可或缺的。

位运算的优势在于:(1)位运算不受数据类型的限制,可以对任何数据进行操作;(2)位运算的操作速度极快,它们的运行速度都比传统的基数运算要快,也比其他类型的运算要快;(3)位运算只需要使用少量的计算资源,因此可以有效减少计算机系统中消耗的电路数量,这是电路节省的重要手段;(4)位运算比较容易实现,它只需要逻辑电路,少量的门电路即可实现特定的运算功能,因此可以有效的提高硬件的性能。

c语言位运算

c语言位运算

C语言位运算详解位运算是指按二进制进行的运算。

在系统软件中,常常需要处理二进制位的问题。

C语言提供了6个位操作运算符。

这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表:运算符含义描述& 按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或若参加运算的两个二进制位值相同则为0,否则为1 ~ 取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 << 左移用来将一个数的各二进制位全部左移N位,右补0 >> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0 1、“按位与”运算符(&)按位与是指:参加运算的两个数据,按二进制位进行“与”运算。

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。

按位与其实与逻辑上“与”的运算规则一致。

逻辑上的“与”,要求运算数全真,结果才为真。

若,A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。

(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。

位是用以描述电脑数据量的最小单位。

二进制系统中,每个0或1就是一个位。

将11(2)补足成一个字节,则是00000011(2)。

5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)按位与运算:00000011(2) &00000101(2) 00000001(2) 由此可知3&5=1 c语言代码:#include <stdio.h> main() { int a=3; int b = 5; printf("%d",a&b); } 按位与的用途:(1)清零若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(3) ∧(按位“异或”) 运算规则为: 0∧0=0,0∧1=1,1∧0=1,l∧1=0 (即当两者取值相异 时为真) 例如,-5∧3的值为-8,运算过程如下: -5 = 111l 1011 (∧) 3 = 00000011 11111000
(4)~(按位“取反”) 运算规则为: ~0=l,~l=0 (取相反的值) 例如,~7的值为-8,运算过程如下:
例12.3 试编一个程序,将一个16进制整数(占2字节)的各位循 环左移4个二进制位,如2fel循环左移4个二进制位后为fe12。 可先取出16进制整数的最高4个二进制位,然后将该整数左移4 个二进制位,最后将先前取出的最高4个二进制位放入低4个二 进制位位置。具体步骤为: (1)取出16进制整数x的最高4个二进制位至y:y=x>>(164)&0xf。 (2)将该整数x(占2字节)左移4个二进制位:x=(x<<4)&0xffff。 (3)将先前取出的最高4个二进制位放入低4个二进制位: x=x|y。
# include <stdio. h> main( ) { unsigned a ; int flag ; scanf (”%u” , & a ) ; while (getchar( ) !=’ e ’ ) { flag=a & 0x8000 ; a=a<<1 ; if ( flag ) a=a | 0x0001 ; } printf (” \na=%u ” , a ) ; }
(~) 7 = 00000111 11111000
(5)<<(“左移”) 用来将一个数的各二进位全部左移若干位,右边空缺位补0。 例如,将3左移2位,结果为12。如图12.1:
左移2位
0 0 0 0 0 0 1 1
0 0 0 0 1 1 0 0
图12.1 3左移两位得到12
左移1位相当于该数乘以2,左移n位相当于该数乘以2 n。 因此,将3左移2位,相当于3乘以4。
关于位段数据,注意以下几点: (1)一个位段必须存储在同一存储单元(即字)之中,不能跨两 个单元。如果其单元空间不够,则剩余空间不用,从下一个 单元起存放该位段。 (2)可以通过定义长度为0的位段的方式使下一位段从下一存 储单元开始。 (3)可以定义无名位段。 (4)位段的长度不能大于存储单元的长度。 (5)位段无地址,不能对位段进行取地址运算。 (6)位段可以以%d,%o,%x格式输出。 (7)位段若出现在表达式中,将被系统自动转换成整数。
右移时应注意符号问题。对于无符号数,右移时左端补0。 对于有符号数,若符号位为0(该数为正),则右移时左端 补0,同无符号数的处理。若符号位为1(该数为负),则右 移时左端是补0还是补1,取决于所用的计算机系统。有的系 统左端补0,称逻辑右移;左端补1,称算术右移。显然,两 种方式所得的结果是不一样的。Turbo C采用的是算术右移。 例如: a: a>>3 a>>3 1111111111101111(补码,其十进制数是-17) 0001111111111101(逻辑右移,高位补0) 1111111111111101(算术右移,其十进制数是-3)
程序如下:
#include <stdio.h> main( ) { int x,y; printf(”\n请输入16进制整数:”); scanf(”%x”,&x); y=x>>(16-4)&0xf; x=(x<<4)&0xffff;/*16位的C语言程序不需要″按位与″0xffff*/ x=x|y; printf(”循环左移4个二进制位得:%x”,x); }
例如,-5&3的值为3,此时要把-5写成补码的形式, 其补码为111l1011,运算过程如下: -5 = 111l 1011 (&) 3 = 00000011 00000011
(2)|(按位“或”) 运算规则为: 0|0=0,0|l=l,1|0=l,l|l=l (即只要有一个为真其结果为真) 例如,5|9的值为13,运算过程如下: 5 = 00000101 ( | ) 9 = 00001001 00001101
(6)>>(“右移”) 用来将一个数的各二进位全部右移若干位。移去右端的位 被舍弃,若为无符号数,左端补0。例如,将15右移2位, 结果为3。如图11.2
右移2位 00 00 1 1 1 1 00 00 0 0 1 1
图11.2 15右移3位得到1
右移1位相当于该数除以2,右移n位相当于该数除以2 n , 因此,将15右移3位,相当于15/2 2 = 3(C语言规定整数相 除商为整数)。
01110011 00000111 &00001111 00000111
115
例12. 2 循环移位。要求将一个无符号数进行左循环移位。 如图12. 4所示。将a左移1位,并将移出位补到右端,输入 ′e
说明:此题很有实用意义。公共场合(如车站)发布信息 的显示屏上滚动显示的信息,就是通过对显示缓冲区做类 似处理来实现的。 解题步骤: (1)提取最高位。 (2)根据最高位为0还是1,设置标志变量为0或非0。 (3)根据标志变量的值,给最低位置0(左移时右端补0, 此步可省略)或置1。 (4)重复以上步骤,直到有键按下。程序如下:
含义 取反 左移 右移
(1)运算量只能是整型或字符型的数据。 (2)运算符中除位反(~)外,均为二目运算符, 即要求两侧各有一个运算量。
2. 位运算 (1)&(按位“与”) 运算规则为: 0&0=0,0&1=0,1&0=0,1&1=l (即只有当两者都为真时 才为真) 例如,5&9的值为1,运算过程如下: 5 = 111l 1011 (&) 9 = 00001001 00000001
# include <stdio. h> main( ) { unsigned a , b ; scanf (”%u” , & a ) ; b=a >> 4 ; b=b & 0x000F; printf (” \na=%u b=%u ”, a , b ) ; } 运行情况如下: 115 a=115,b=7
输入135
10000111 8000 0001
1000 0000 0000 0000 0000 0000 0000 0001
运行情况如下: 135 e a=270
§12.3 位段结构
位段结构也是一种结构体类型,只不过其中含有以位为 单位定义存储长度的整数类型位段成员。在某些应用中, 特别是对硬件端口的操作,需要标志某些端口的状态或特 征。而这些状态或特征只需要一个机器字中的一位或连续 若干位来表示。采用位段结构既节省存储空间,又可方便 操作。
位段结构中位段的定义格式为: unsigned <成员名 :<二进制位数 成员名>: 二进制位数 二进制位数> 成员名 例如: struct bytedata { unsigneda:2; unsigned:6; /*位段a,占2位*/ /*无名位段,占6位,但不能访问*/
unsigned:0;/*无名位段,占0位,表示下一位段从下一字边界开始 unsignedb:10; int i; }data; /*位段b,占10位*/ /*成员i,从下一字边界开始*/
位运算
§12.1 位运算符与位运算
位是指二进制数的一位,其值为0或1。位段 以位为单位定义结构体(或共用体)中成员所占存 储空间的长度。含有位段的结构体类型称为位段 结构。
1. 位运算符 位运算符主要有如表11.1所示。
运算符 & | ∧ 说明:
含义 按位与 按位或 按位异或
运算符 ~ << >>
§12.2 程序举例
例12. 1 取一个无符号数的4 ~ 7位。设无符号数用2个1) 字节存储。 解题思路: (右移4位,使要取出的位移到最右端。如图11. 3所示
15
7
4
0
15
3
0
图11. 3 两个字节的无符号数右移4位
(2)根据提取指定位的方法,和0000000000001111(十六 进制数0x000F)进行位与运算,程序如下:
对16位的Turbo C2.0而言,data变量的内存分配示意图见 图12.5。
位段a 2位 无位段 名 6位 8位 10位 6位 16位 未用 位段b 未用 成员i
低地址 图12.5 data变量的内存分配示意图
高地址
应该注意的是,16位的Turbo C 2.0的字边界在2 倍字节处,其他的C语言的字边界可能在若干倍字 节处(如VisualC++6.0在4倍字节处)。位段数据的引 用,同结构体成员中的数据引用一样,但应注意位 段的最大取值范围不要超出二进制位数确定的范围, 否则超出部分会丢弃。
程序运行结果如下: 请输入16进制整数:2fe1 循环左移4个二进制位得:fel2
相关文档
最新文档