C语言之位运算
- 格式:ppt
- 大小:64.50 KB
- 文档页数:17
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 等等)。
第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。
C语言的位运算位运算是指按二进制进行的运算。
在系统软件中,常常需要处理二进制位的问题。
C语言提供了6个位操作运算符。
这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:&,按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0|,按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1^ ,按位异或,若参加运算的两个二进制位值相同则为0,否则为1~ ,取反,~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<<,左移,用来将一个数的各二进制位全部左移N位,右补0>>,右移,将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补01、“按位与”运算符(&)按位与是指:参加运算的两个数据,按二进制位进行“与”运算。
如果两个相应的二进制位都为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=1c语言代码:#include <stdio.h>main(){int a=3;int b = 5;printf("%d",a&b);}按位与的用途:(1)清零若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。
c语言位运算优先级C语言中的位运算是指对二进制数进行运算的操作。
位运算是一种快速且高效的运算方式,可以在一次计算中同时处理多个数位。
在C语言中,位运算具有特定的优先级,即不同的位运算符具有不同的执行顺序。
本文将重点介绍C语言中位运算的优先级及其使用方法。
在C语言中,位运算的优先级由高到低依次为:~(取反)、<<(左移)、>>(右移)、&(按位与)、^(按位异或)和|(按位或)。
位运算的优先级规定了在表达式中多个位运算符同时出现时的执行顺序。
下面将分别介绍各个位运算符及其优先级。
1. ~(取反)运算符:~是一元运算符,用于对一个数的每一位取反。
它的优先级最高,可以直接作用于一个数或表达式。
例如,~3的结果是-4,因为3的二进制表示为0000 0011,取反后为1111 1100,再转换为十进制即为-4。
2. <<(左移)和 >>(右移)运算符:<<是二元运算符,用于将一个数的二进制表示向左移动指定的位数,右边空出的位用0填充。
>>也是二元运算符,用于将一个数的二进制表示向右移动指定的位数,左边空出的位用符号位填充。
左移和右移运算符的优先级次于~运算符。
例如,8 << 2的结果是32,因为8的二进制表示为0000 1000,向左移动2位后变为0010 0000,即32。
3. &(按位与)运算符:&是二元运算符,用于对两个数的每一位进行与运算。
它的优先级次于<<和>>运算符。
例如,3 & 5的结果是1,因为3的二进制表示为0000 0011,5的二进制表示为0000 0101,按位与后得到0000 0001,即1。
4. ^(按位异或)运算符:^是二元运算符,用于对两个数的每一位进行异或运算。
它的优先级次于&运算符。
例如,3 ^ 5的结果是6,因为3的二进制表示为0000 0011,5的二进制表示为0000 0101,按位异或后得到0000 0110,即6。
C语⾔位运算详解及⽰例代码所谓位运算,就是对⼀个⽐特(Bit)位进⾏操作。
在《⼆进制思想以及数据的存储》⼀节中讲到,⽐特(Bit)是⼀个电⼦元器件,8个⽐特构成⼀个字节(Byte),它已经是粒度最⼩的可操作单元了。
C语⾔提供了六种位运算符:运算符&|^~<<>>说明按位与按位或按位异或取反左移右移按位与运算(&)⼀个⽐特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。
例如1&1为 1,0&0为0,1&0也为 0,这和逻辑运算符&&⾮常类似。
C语⾔中不能直接使⽤⼆进制,&两边的操作数可以是⼗进制、⼋进制、⼗六进制,它们在内存中最终都是以⼆进制形式存储,&就是对这些内存中的⼆进制位进⾏运算。
其他的位运算符也是相同的道理。
例如,9 & 5可以转换成如下的运算:0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)-----------------------------------------------------------------------------------0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)也就是说,按位与运算会对参与运算的两个数的所有⼆进制位进⾏&运算,9 & 5的结果为 1。
⼜如,-9 & 5可以转换成如下的运算:1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)-----------------------------------------------------------------------------------0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)-9 & 5的结果是 5。
位运算 c语言位运算是计算机编程中常用的一种运算方式,通过对二进制数的位进行逻辑运算来实现各种功能。
在C语言中,位运算符提供了一系列操作符,可以对整数类型的数据进行位运算。
C语言中的位运算符包括与运算符(&)、或运算符(|)、异或运算符(^)、非运算符(~)、左移运算符(<<)和右移运算符(>>)。
下面将逐一介绍这些运算符的功能和使用方法。
与运算符(&)用来对两个二进制数的对应位进行逻辑与运算,只有当两个位都为1时,结果位才为1,否则为0。
例如,对于二进制数1010和1100进行与运算,结果为1000。
或运算符(|)用来对两个二进制数的对应位进行逻辑或运算,只要有一个位为1,结果位就为1。
例如,对于二进制数1010和1100进行或运算,结果为1110。
异或运算符(^)用来对两个二进制数的对应位进行异或运算,当两个位不同时,结果位为1,否则为0。
例如,对于二进制数1010和1100进行异或运算,结果为0110。
非运算符(~)用来对一个二进制数的各位进行取反运算,即将0变为1,将1变为0。
例如,对于二进制数1010进行非运算,结果为0101。
左移运算符(<<)用来将一个二进制数的各位向左移动指定的位数,右侧用0填充。
例如,将二进制数1010左移2位,结果为101000。
右移运算符(>>)用来将一个二进制数的各位向右移动指定的位数。
对于无符号数,左侧用0填充;对于有符号数,左侧用符号位填充。
例如,将二进制数1010右移2位,结果为0010。
位运算在计算机编程中有着广泛的应用。
例如,可以使用位运算来进行数据压缩和解压缩,通过对数据进行位的压缩,可以减少存储空间的占用。
此外,位运算还可以用于位图操作、位字段操作、位掩码操作等。
在使用位运算时,需要注意一些细节。
首先,位运算符的优先级较低,需要使用括号来区分运算次序。
其次,位运算符只能用于整数类型的数据,不能用于浮点数。
c语言整型数据取个位十位百位位运算在C语言中,我们可以使用位运算符来进行位运算。
位运算是直接对二进制数进行操作的运算,它们可以高效地进行位级操作。
对于整型数据,我们可以通过位运算来获取其个位、十位和百位的值。
我们需要了解一下位运算中的一些基本操作符:1. 与运算(&):对两个数的每一位进行与操作,只有当两个操作数的对应位都为1时,结果位才为1。
2. 或运算(|):对两个数的每一位进行或操作,只要两个操作数的对应位中有一个为1,结果位就为1。
3. 异或运算(^):对两个数的每一位进行异或操作,当两个操作数的对应位不同时,结果位为1;当两个操作数的对应位相同时,结果位为0。
4. 取反运算(~):对一个数的每一位取反,即将每一位的0变为1,1变为0。
5. 左移运算(<<):将一个数的每一位都向左移动指定的位数,右边空出的位用0填充。
6. 右移运算(>>):将一个数的每一位都向右移动指定的位数,左边空出的位用原来的符号位填充。
有了上述基础知识,我们就可以开始使用位运算来获取整型数据的各个位数了。
我们来获取个位数。
个位数就是一个数对10取余的结果。
我们可以使用按位与运算符来实现这个操作。
具体步骤如下:1. 定义一个整型变量num,并给它赋予一个整数值。
2. 使用num & 0x0000000F进行按位与运算,其中0x0000000F 是一个只有个位为1,其他位为0的数。
3. 将运算结果保存到一个新的变量中,即个位数的值。
接下来,我们来获取十位数。
十位数就是一个数除以10取余后再除以10取余的结果。
我们可以使用位移运算和按位与运算符来实现这个操作。
具体步骤如下:1. 定义一个整型变量num,并给它赋予一个整数值。
2. 使用num >> 4进行右移4位,将个位和十位的值放到低4位上。
3. 使用num & 0x0000000F进行按位与运算,将高位的值置为0。