Clanguage第12章位运算

合集下载

C12位运算

C12位运算

12.1.4 ~ (按位取反)
对一个二进制数按位取反 ( 0 → 1 1 → 0 ),如 :
~ 00011001
11100110
例如 : 若一个整数 a 为16 位,要使 a 最低一位为 0。 a= a & 0177776 ; (常量与 a 的字长有关 )
最好的用法是以下表达式:(与 a 的字长无关)
(2) 设置一个右端4位全为1其余全为 0的数: ~(~0<<4) --- ~0=111111….11 , ~0<<4=1111….10000 , c = ~( ~0<<4)=0000….1111
(3) 将上述两个数进行 & 运算: d=b& c ;
a
15
87
43
0
b
15
43 0
程序如下:
void main( ) {
01110101
2. 用 0去与某些位异或 , 保留原值。 上例中前 4 位用 0去异或,保留原值 0111
3. 交换两个值 , 不用临时变量。 例如 : a=a ^ b ; b=b ^ a ; b=b ^ (a ^ b) =b ^ a ^ b =a ^ b ^ b=a a=a ^ b ; a=(a ^ b) ^ a =a ^ b ^ a=b ^ a ^ a=b
第十二章 位运算
第十二章 位运算
在计算机控制领域中常用到位运算。这是C语言的重要特色 。
12 . 1 位运算符和位运算
位运算-----二进制位的运算 (只能是整型和字符型数据,不能为实型数据)。
运算符
含义
& | ^
~(一目运算符)
<<
>>

12_位运算

12_位运算
12 位运算

计算机的特点:数据是以二进制数0和1的组 合表示的; 机器指令由二进制数组成的。 位运算与机器有关 一般地,计算机用8个位构成一个字节;两个 字节构成一个字长。 位运算符常用于 int和 unsigned 类型的整数。
1




C语言中的位操作运算符共有6个:
1. ~
作用:按位取反
如:a=10011010 则:~a=01100101
注:(ffff)16=15163+15162+ 15161 +15160 =65535
7
2. 按位左移:<< 表达式:变量名<<位数
作用: 把变量名所代表的数中各个位全部左移
若干位,右边空出的位补零。 如:a<<2 a<<3
8
例1:main( ) { int a=8; (二进制数:00001000) int b= 8; printf("%d\n", a<<2); 运行结果: 32 printf("%d\n", b<<2); 32 } 分析: 对正整数:a= 00001000 a<<2= 0000100000
4
位运算符的使用方法
位运算符分为两类: 1. 只有一个变量参与运算: ~, <<, >> 2. 有两个变量参与运算: &, |, ∧
5
位运算时,可采用八进制或十六进制数。
例: main( ) {unsigned int a=0; printf("%x, %u\n", ~a, ~a); } 运行结果:ffff, 65535
20

位运算(转)

位运算(转)

位运算(转)12 位运算 C语⾔是为描述系统设计的,因此它应该具有汇编语⾔所以完成的⼀些功能。

C语⾔既有⾼级语⾔的特点,⼜具有低级语⾔的功能。

因⽽具有⼴泛的⽤途和很强的⽣命⼒。

12.1 位运算符和位运算运算符 含义& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移说明:(1)位运算符中除 ~ 外,均为⼆⽬运算符,即要求出侧各有⼀个运算量。

(2)运算早只能是整型或字符型的数据,不能为实型数据。

12.1.1 按位与运算符 & 参加运算的两个数制,按⼆进制进⾏与运算。

如果两个相应的⼆进位数为1,刚该位的结果为 1 否则为 0 即: 0 & 0 = 0;0 & 1 = 0;1 & 0 = 0;1& 1 = 1例如:3 & 8 并不等于8,应该是按位与3 = 000000115 = 00000101 &00000001 因此 3 & 5 的值得 1,如果参加 & 是负数(-3 & -5),则以补码形式表⽰为⼆进制数。

然后按位进⾏与运算。

按拉与有⼀些特殊的⽤途: (1)清零。

如果想将⼀个单元清零,即使其全部⼆进位为 0,只要找⼀个⼆进制数,其中各个位符合以下条件:原来数中为 1 的位,新数中相应位为 0。

然后使⼆者进⾏ & 运算,即可以达到清零⽬的。

(2)取⼀个数中某些指定位。

如有⼀个整数 a (2个字节)想要其中的低字节。

只需将 a 与(337)。

按位与即可。

(3)要想将哪⼀个保留下来,就与⼀个数进⾏ & 运算,此数在该位位1,如有⼀个数 01010100,想把其中左⾯第3,4,5,7,8可以这样运算:0101010000111011 &0001000012.1.2 按位或运算符 | 两个相应的⼆进位中只要有⼀个为 1,该位的结果就为 1。

0|0=0; 0|1=1; 1|0=1; 1|1=1; 按位或运算常⽤来对⼀个数据的某些位定值为1,如 a 是⼀个整数(16位)有表达式 a & 0377,则低 8 位全置为 1。

C语言中的位运算与移位操作详解

C语言中的位运算与移位操作详解

C语言中的位运算与移位操作详解C语言中的位运算是指对数据的二进制位进行操作的一种操作方式,其中包括位与(&)、位或(|)、位异或(^)、位取反(~)等。

位运算通常用于各种底层编程和优化算法中,能够快速高效地操作二进制数据。

下面将详细介绍C语言中常用的位运算符及其操作。

1. 位与(&):将两个操作数的对应位进行与运算,只有当两个对应位都为1时,结果位才为1;否则为0。

例如,0b1101 & 0b1011 = 0b1001。

2. 位或(|):将两个操作数的对应位进行或运算,只要两个对应位中有一个为1,结果位就为1;否则为0。

例如,0b1101 | 0b1011 = 0b1111。

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

例如,0b1101 ^ 0b1011 = 0b0110。

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

例如,~0b1101 = 0b0010。

除了以上基本的位运算符,C语言还提供了左移(<<)和右移(>>)操作符,用于对操作数进行移位操作。

1. 左移(<<):将一个操作数的所有位向左移动指定的位数,移动时低位补0。

例如,0b1101 << 2 = 0b0100。

2. 右移(>>):将一个操作数的所有位向右移动指定的位数。

根据操作数的符号位和机器的具体实现,右移可能是算术右移(负数最高位补1)或逻辑右移(0填充)。

例如,0b1101 >> 1 = 0b0110(逻辑右移);0b1001 >> 1 = 0b1100(算术右移)。

位运算和移位操作在C语言中的应用非常广泛,主要用于以下几个方面:1. 位掩码:通过位与运算(&)可以用来提取操作数的指定位或者对操作数的指定位进行清零操作。

这在一些底层硬件控制或者状态管理中非常有用。

Clanguage第12章位运算教学讲义

Clanguage第12章位运算教学讲义
函数 control()实现输出控制:通过屏幕显示和喇叭鸣笛的方式 输出温度值、温度级别、设备开关情况和报警状态。
#define ON 1 #define OFF 0 struct ctrl_type { unsigned char tem1;
float tem2; unsigned lmp:5; unsigned sw1:1; unsigned sw2:1; unsigned alm:1; };
他位与1相与,即将 k与十六进制的 1110 相与。 程序如下: unsigned int_set(unsigned int k) { k=k & 0x1110 ; return(k); }
结论:任何二进制位与0相与能实现置0,与1相与该 位保持不变。
2)"按位或"运算经常用与将某些二进制位 置 1。 例12.4:将一个字节的高4位置为1010并输出结果。 分析:直接用位运算符,可以很方便的置1、清0、翻转等,但
(2)四个位段存放(要输出的)控制数据。其中,位段lmp 宽度为5,控制五个温度指示灯,值为1时灯亮,为0时灯不 亮。其余的3个位段sw1、sw2、alm宽度均为1,分别控制升 温设备、降温设备和报警设备,都是为“1”时开启,为0时 关闭。
函数sample()实现测温采样:通过键盘输入模拟测温数据,并 转换成实际温度值。
第12章 位运算
1. 位运算符及其应用 2. 位段及其应用
12.1位运算符和位运算表达式
C语言中提供了如下6种的位运算符: & 按位与 | 按位或 ^ 按位异或 << 左移 >> 右移 ~ 按位取反 提示:只允许对整型、字符型数据进行位运算,而
实型数据不能进行位运算。
1. 位运算的应用: 2. 1)"按位与"运算经常用于将某些二进制位屏蔽掉。 3. 例12.2 编写函数:使一个整数k中的低4位置0。 分析:用“与”运算实现:将k的低4位与0相与,其

《新概念C语言能力教程》第12章位运算

《新概念C语言能力教程》第12章位运算

• 分析:用异或操作改变某位的状态以控制相关灯的明灭,使用左移操作构造 操作数。
例12-3 把一个整数32位中的高16位和低16位互换。
12.3 位段
• C语言允许在一个结构型中以位为单位指定其成员实际存储空间的长度,结 构型中指定了存储长度的成员就是所谓的位段。
• 结构型struct bitfield虽然有三个内部成员a,b,c,但它们存储空间的长度只有 2位、4位和2位。内部成员a、b、c虽然位数不多,但仍为int型,有符号数 ,即a和c的取值范围为-2至1,b的取值范围为-8至7。
• 位段的类型只能为整型(有符号,无符号及字符型)
12.1.3 异或操作符^
• 异或操作符^也称xor操作符。异或操作符^将参与运算的两个操作数以二进制 位为单位进行“异或”运算。
• “异或”运算可理解为“判断是否不同(为异)”的运算。异或运算时,如 果两个二进制位上的数相同,则运算结果的此位为0(表示否,不为异); 如果两个二进制位上的数不同,则运算结果的此位为1(表示是,为异)。
12.1.6 右移操作符>>
• 右移操作符与左移操作符类似,表达式a >> n求值时,会将a的二进制位全 部右移n位,右端移出的n位被舍弃。根据左端移入数的不同,右移操作分为 “逻辑右移”和“算术右移”两种。
• 逻辑右移时,无论a为何类型,左端均移入n个0; • 算术右移时,如果a为非负数,则左端移入n个0;如果a为负数,则左端移入
• 左移操作符<<的常用形式为:a << n • 其中,a和n均为整数,求值时a的二进制位全部左移n位,右端补n个0,舍
弃左端移出的n位。显然n的取值范围通常为1至sizeof(a) * 8。 • 在位运算中,左移操作符常用于构造操作数。 • 无符号字符型变量c的值为165,需点亮第6号灯,可以用如下表达式c |= 1

位运算 c语言

位运算 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++课件:第12章位运算


右移运算符(>>)
二进制右移运算
右移运算符(>>)将一个整数的二进制 表示向右移动指定的位数,左侧用符 号位填充(对于有符号整数)。右移n 位相当于将该数除以2的n次方。
03
位运算示例
示例一:使用位运算符实现加密和解密
总结词
通过位运算实现简单的加密和解密功能
详细描述
使用位运算符对二进制数进行异或(XOR)运算,可以实现简单的加密和解密 功能。异或运算的特点是,相同位得0,不同位得1,因此可以对二进制数据进 行加密或解密。
04
位运算的应用场景
数据加密
通过将数据转换为二进制形式,并使用位运 算进行加密和解密操作,可以保护数据的机 密性。
硬件控制
在嵌入式系统或硬件编程中,使用位运算可 以对硬件寄存器进行直接操作,实现快速、 高效的硬件控制。
图像处理
在图像处理中,可以使用位运算实现像素级 别的操作,如图像的合并、掩码处理等。
答案
可以使用按位与运算符(&)实现两个整数的 对应位进行逻辑与操作。例如,要将整数x和y 的对应位进行逻辑与操作,可以使用x &= y的 语句。这将把x和y的对应位进行逻辑与操作, 并将结果存储在x中。
05
总结与回顾
位运算的重要性和应用场景
重要性和应用场景
位运算在计算机科学中具有广泛的应用,如 数据加密、网络协议处理、硬件交互等。通 过位运算,可以对二进制位进行操作,从而 实现高效的底层操作和控制。
02
位运算符详解
按位与运算符(&)
二进制按位与运算
按位与运算符(&)对两个整数的二进制表示进行逐位比较,只有当两个相应的二进制 位都为1时,结果位才为1,否则为0。

谭浩强C语言教程_第十二章-位运算-推荐下载


12.1.2 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只 要对应的二个二进位有一个为 1 时,结果位就为 1。参与运算的两个数均以补码出现。
例如:9|5 可写算式如下:
【例 12.2】
00001001
|00000101 00001101
main(){
}

int a=9,b=5,c;
12.1.4 求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位 求反。 例如~9 的运算为:
~(0000000000001001)结果为:1111111111110110
12.1.5 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若 干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补 0。
12
位运算 ................................................................1
12.1 位运算符C语言提供了六种位运算符: ................................1
12.1.1
按位与运算 ................................................1
unsigned a,b; printf("input a number: "); scanf("%d",&a); b=a>>5; b=b&15; printf("a=%d\tb=%d\n",a,b); }

C语言第12章位运算


6.按位右移── >> (1)格式:x>>位数 (2)规则:使操作数的各位右移,移出的低位舍弃;高位: 1)对无符号数和有符号中的正数,补0; 2)有符号数中的负数,取决于所使用的系统:补0的称 为“逻辑右移”,补1的称为“算术右移”。例如,20 >> 2=5。
说明: (1)x、y和“位数”等操作数,都只能是整型或字符型数据。 除按位取反为单目运算符外,其余均为双目运算符。 (2)参与运算时,操作数x和y,都必须首先转换成二进制形 式,然后再执行相应的按位运算。 例如,5<<2=20:0101 → 10100,20 >> 2=5:10100 → 00101。
当然,也可以用%u、%o、%x等格式符输出。 7·位段可以在数值表达式中引用,它会被系统自动地转换成整 型数。如 data.a+5/data.b 是合法的。
二、位段 所谓位段是以位为单位定义长度的结构体类型中的成 员。例如: struct packed_data {unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i }data; 其中a,b,c,d,分别占2位、6位、4位、4位。i为整型, 共占4个字节。
对位段中的数据引用的方法。如: data.a =2; data.b =7; data.c =9; 注意位段允许的最大值范围。如果写data.a=8 就错了。因为它只占2位,最大值为3。在此情况下,自动 取赋予它的数的低位。例如,8的二进制数形式为1000,而 data.a 只有2位,取 1000 的低2位, data.a 得值0。
关于位段的定义和引用,有几点要说明: 1.位段成员的类型必须指定为unsigned和int型。 2. 若某一位段要从另一个字开始存放。可以用以下形式定义: unsigned a:1; unsigned b:2; 一个存储单元 unsigned :0; unsigned c:3; (另一单元) 本来a、b, c应连续存放在一个存储单元(字)中,由于用了 长度为0的位段,其作用是使下一个位段从下一个存储单元开 始存放。因此,现在只将a、b存储在一个存储单元中,c另 存放在下一个单元。 3.一个位段必须存储在同一存储单元中,不能跨两个单元。 如果第一个单元空间不能容纳下一个位段,则该空间不用,而 从下一个单元起存放该位段。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.
结论:任何二进制位与0相与能实现置0,与1相与该 位保持不变。
2)"按位或"运算经常用与将某些二进制位 置 1。 例12.4:将一个字节的高4位置为1010并输出结果。 分析:直接用位运算符,可以很方便的置1、清0、翻转等,但 无法直接实现置给定的值。可以用两步实现:首先将高4位 清 0,然后与1010 0000相或。程序如下:
第12章 位运算
1. 2.
位运算符及其应用 位段及其应用
12.1位运算符和位运算表达式
C语言中提供了如下6种的位运算符: & 按位与 | 按位或 ^ 按位异或 << 左移 >> 右移 ~ 按位取反 提示:只允许对整型、字符型数据进行位运算,而 实型数据不能进行位运算。

1.
位运算规则: A 0 B 0 A&B 0 A|B 0 A^B 0 ~a 1
4)左移、右移运算实现将一个数的各个二进制位向左、向 右移若干位。 左移:将一个数的各个二进制位左移若干位,高位左移 后舍弃,低位补0 。 若定义: int a=8; 即a= 0000 1000 , 则语句a=a<<2;
将 a 的各二进制位左移 2 位,空出的低位补0。结果为:
0010 0000
右移:将一个数的各个二进制位右移若个位,低位右移 后舍弃,高位补 0还是补1,要区别有符号数还是无符号 数:无符号数高位补0,有符号数高位补原符号位。 若定义 unsigned int a=8; 即 00001000, 则语句 a=a>>2 ;将 a 的各二进制位右移 2 位,空出的 高位补 0。结果为: 0000 0010
4.位段的应用 编程模拟一个温度测控系统:从键盘输入模拟温 度的采样值(0~255),该采样值与0.2相乘, 得出实际温度值,根据该温度值,控制温度指 示灯的亮与灭(从0度开始,温度每增加10度 则多点亮一个指示灯);将该温度值与设定温 度比较,当温度小于10度和高于40度时分别开 启升温设备和降温设备,同时报警。反复以上 过程,直至输入的测温值为300为止。

变量data 的存储结构如图 :


a b c i …… 成员名 2 6 4 4 16 …… 长度 3.位段的引用 位段是结构体类型的某个成员,因此,位段的引用同结构体成 员的引用方法相同。 如:data.a=0x01; /*给位段a赋值, */ data.b=0x0a; /*给位段b赋值*/ data.i=12; /*给位段 i赋值*/ printf(“%02x, %02x, %4d”, data.a , data.b ,data.i ); 输出: 01, 0a, 12 特别提示:使用位段时,要注意该位段的能表示的数据的范围。
0
1 1
1
0 1
0
0 1
1
1 1
1
1 0
1
0 0
例12.1 若 a=(15)10=(00001111)2, b=(80)10=(01010000)10 则: a&b = 0000 0000, a|b = 0101 1111, a^b =01011111 , ~a = 1111 0000
位运算的应: 1)"按位与"运算经常用于将某些二进制位屏蔽掉。 例12.2 编写函数:使一个整数k中的低4位置0。 分析:用“与”运算实现:将k的低4位与0相与,其 他位与1相与,即将 k与十六进制的 1110 相与。 程序如下: unsigned int_set(unsigned int k) { k=k & 0x1110 ; return(k); }
分析:系统中需要控制的设备有:五个温度指示灯,升温设备, 降温设备,报警设备。因此可用如下的结构体变量word表 示该系统的控制字,其成员构成如下: (1)无符号整型tem1 用来存放输入的温度采样值(0~255), 若每个刻度代表0.2度,则可以测量的温度范围为0~51度。 浮点类型的成员tem2用来存放tem1成员转换成的温度值。 (2)四个位段存放(要输出的)控制数据。其中,位段lmp 宽度为5,控制五个温度指示灯,值为1时灯亮,为0时灯不 亮。其余的3个位段sw1、sw2、alm宽度均为1,分别控制升 温设备、降温设备和报警设备,都是为“1”时开启,为0时 关闭。 函数sample()实现测温采样:通过键盘输入模拟测温数据,并 转换成实际温度值。 函数 control()实现输出控制:通过屏幕显示和喇叭鸣笛的方式 输出温度值、温度级别、设备开关情况和报警状态。
/*设 a 为待处理的数据,转换成二进制为00001000, b用来保存将a的高4位清0后的结果*/ main() { unsigned char a,b,c; a=8; b=a&0x0f; c=b|0xa0; /*c用于保存最终结果*/ printf("%x",c); }
运行结果:10101000
12.2 位段
1. 位段的概念 以位为单位定义其长度的结构体成员。 2.位段的定义 例12.6若某个控制字长32位,分5段,每段的长度分别为: 2 ,6 ,4 ,4 ,16位 ;每段存放一个信息,且第4段空 出不用。可用如下结构体类型描述: struct con_word { unsigned a: 2; /*位段a,长度为2*/ unsigned b: 6 ; /*a,b,c为有名位段*/ unsigned c: 4; unsigned : 4; /*该位段为无名位段,表示这4位空间 空出不使用*/ int i ; } data;
3)按位异或运算经常用与将某些位翻转。 例12.5 编程实现,将一整数n的高8位翻转,低8位不变 分析:用“异或”运算实现,即高8位与1相异或,低8位与0 相异或,也就是k与十六进制的ff00相异或。程序如下: main() { int n=129; printf("\n before reset,n=%x",n); n=n∧0xff00; printf("\n after reset,n=%x",n); } 运行结果: before reset,n=00000000 10000001 after reset,n=11111111 10000001 结论:任何二进制位与0异或,保持不变;与1异或,对应位 翻转。
相关文档
最新文档