C21第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 位运算 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。

第12章 位运算

第12章 位运算
2012年4月22日5时28分 1
第 12章 位运算
~运算常用于产生一些特殊的数。 运算常用于产生一些特殊的数。 xFF00 00, 如高 8 位全 1 低 8 位全 0 的数 0xFF00, 按位取 00FF FF。 位的系统中, 反后变为 0x00FF 。 ~ 1, 在 16 位与 32 位的系统中 , 的整数。 都代表只有最低位为 0 的整数。 运算是位运算中唯一的单目运算, ~运算是位运算中唯一的单目运算, 也是唯一具有右结 合性的位运算。 合性的位运算。
第 12章 位运算
12.1 位逻辑运算
按位取反运算 1. 按位取反运算 运算符: 运算符: ~ 按位取反运算用来对一个二进制数按位取反, 按位取反运算用来对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。 例如: ~25, 25的二进制表示为: ~ 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1111111111100110 即 -26。 。
(2)a | 0xFFFF, a的每一位全置 1。 a的每一位全置 (2)a
2012年4月22日5时28分
5
第 12章 位运算
按位异或运算 4. 按位异或运算 运算符: 运算符: ^ 操作数的对应位相同, 操作数的对应位相同, 则该位的运算结果为 0, 否则为 1。 例如: 29^ 的二进制表示为: 例如: 0x29^0x37 , 0x29 与 0x37 的二进制表示为: 0000000000101001与0000000000110111 0000000000101001与0000000000110111 按位异或结果为: 按位异或结果为: 0000000000011110, 0000000000011110, 即等于 0x1e。 利用^运算将数的特定位翻转, 保留原值, 利用^运算将数的特定位翻转, 保留原值, 不用临时变 量交换两个变量的值。 量交换两个变量的值。

C++课件:第12章位运算

C++课件:第12章位运算

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

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语言电子课件第12位运算

C语言电子课件第12位运算

(4) 按位右移运算主要用途 按位右移运算主要用途是对操作数做除法运算,即 将一个操作数除以 2n 的幂运算处理为右移 n 位的 按位右移运算。右移一位相当于除以 2 ,右移 n 位 相当于除以2n。 例4 从键盘上输入1个正整数给int变量n ,输出 由8~11位构成的数(从低位、0号开始编号)。 基本思路: (1)使变量n右移8位,将8~11位移到低4位上 (2)构造1个低4位为1、其余各位为0的整数。 (3)与n 进行按位与运算。 (4)输出与运算结果。
1 位 逻 辑 运 算
1. 位运算说明 ( 1 )位运算的操作数,只能是整型或字符型数据, 不能为实型数据。 (2 )位运算符中除按位取反“ ~”为单目运算符外, 其余均为二目运算符,即要求两侧各有一个运算量。
( 3 )参与运算时,操作数都必须首先转换成二进制
形式,然后再执行相应的按位运算。
2. 按位与运算符 (1) 按位与运算符:&
例6 从键盘上输入1个正整数给整型变量n,按二进制位输出该数。 #include "stdio.h" main() { int n, mask, i; printf("Input a integer number: "); scanf("%d",&n); /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/ mask = 1<<15; printf("%d=" , n); for(i=1; i<=16; i++) { putchar(n&mask ? ‟1‟ : „0‟); /*输出最高位的值(1/0)*/ n <<= 1; /*将次高位移到最高位上*/ if( i%4==0 ) putchar(„,‟); } /*四位一组,用逗号分开*/ printf("\bB\n"); } 程序运行情况: Input a integer number:1000 ←┘ 1000=0000,0011,1110,1000B

C21第12章 位运算.ppt

C21第12章 位运算.ppt

构造操作数
无符号字符型变量c的值为165,需点亮第6号灯,可以 用如下表达式
c |= 1 << 6,其中,1 << 6即0100 0000。 注意: 左移操作也可看作算术运算,故其优先级低于算术操作 符但高于关系运算符。 单目操作符~的优先级较高。按位与、按位或和按位异
或的优先级低于关系操作符,但高于逻辑操作符。return
12.2 位运算示例 12.3 位段
位运算
位运算是指按二进制位进行的运算,实际上就是直接对整数 在内存中的二进制位进行操作。
考虑这样的问题:编程控制编号为0至7的八盏灯的开关。 可以定义一个长度为8的短整型数组变量a。 可以定义一个无符号的字符型变量c。 如果c的值为128(1000 0000),则7号灯亮,其余灯灭;为 192时(1100 0000),则6号和7号灯亮,其余的灭。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。
return
12.1.5 左移操作符<<
左移操作符<<常用形式为:a << n 其中,a和n均为整数,表达式求值时将a的二进制位全 部左移n位,右端补n个0,左端移出的n位因溢出而舍弃。 显然n的取值范围通常为1至sizeof(a)。 左移1位的值为a的2倍,左移2位的值为a的4倍,……( 表达式的值不能超出整型的取值范围)。左移操作要比相 应的乘法运算(a*2)快得多。 在位运算中,左移运算常用于构造操作数。
当参与运算时,位段会自动转换成整型,当给位段赋一 个超出其取值范围的值时,左端多余的位数会被舍弃。
位段类型转换和赋值的原则与C语言基本类型所遵循的 原则相同,如printf("%d,%d\n", bf.a + bf.b, bf.c = 15)的输出为-7,-1。

谭浩强C语言第12章

谭浩强C语言第12章
C 程序设计 电子ห้องสมุดไป่ตู้案
教师: 教师:葛龙
第十二章:位运算 第十二章:
主要内容: 主要内容: 按位与运算符( & ) 按位与运算符( 按位或运算符( | ) 按位或运算符( 异或运算符( ^ ) 异或运算符( 取反运算符( ~ ) 取反运算符( 左移运算符( << ) 左移运算符( 右移运算符( >> ) 右移运算符(
例子,交换两个变量的值,不用中间变量. 例子,交换两个变量的值,不用中间变量. a=a^b; b=b^a; a=a^b; a=a+b; b=ab=a-b; a=aa=a-b;
取反运算符~ §12.1 取反运算符 每一位上, 每一位上,按位取反 .
~3 3 00000011 ~ 11111100
左移运算符<< §12.1 左移运算符<< 进来,相当于乘2 从左向右移 0 进来,相当于乘2 .
按位与运算符& §12.1 按位与运算符& 每一位上, 每一位上,见 0 得 0 .
3&5 00000011 & 00000101 00000001 &
-3&5 11111101 00000101 00000101
按位与通常用来把某些位清零. 按位与通常用来把某些位清零.
按位或运算符| §12.1 按位或运算符| 每一位上, 每一位上,见 1 得 1 .
-3^5 11111101 00000101 11111000
按位或通常用来把某些位的值翻转. 按位或通常用来把某些位的值翻转.
异或运算符^ §12.1 异或运算符^ 异或运算符有一个特殊性质,某个值异或另一个值两次, 异或运算符有一个特殊性质,某个值异或另一个值两次, 会得到这个值本身. 会得到这个值本身.如: a^b^b =a b^a^a =b

C语言位运算

C语言位运算
x 1011 1010 & 0000 0000 结果 0000 0000
取指定位 x = x & 0xf0 ; (高4位)
x 1011 1010 & 1111 0000 结果 1011 0000 保留指定位 x 01010100 & 00111011 结果 00010000
2.“按位或” 运算符 ( | )
(2) 用途: 与其它位运算配合使用。 a=a&~1——将最后一位置0
例如:main()
{ unsigned char a,b; a=0x9d; b=0xa5; printf(“~a: %x\n”, ~a); printf(“a&b: %x\n”,a&b); printf(“a | b: %x\n”,a | b); printf(“a^b: %x\n”,a^b);
}
输出结果: ~a: 62 a&b: 85 a | b: bd a^b: 38
5.“左移运算” 运算符 (<< ) (1)规则:
二进制数的各位依次左移,高位移走作废,低位补0
D7 D6 D5 D4 D3 D2 D1 D0
0
(2) 用途:对于一个无符号整数,若左移若干位后不溢 出(<=65535), 则每左移一位相当于原值乘2
x.c);
(1) 规则:两个运算量的相应位之间进行运算,两个
对应位中只要有一个为“1”时,结果就为“1”,
否则结果为“0”
0010 1010
| 1010 0011
(2) 用途:
结果 1010 1011
将数据中某些位置为1
x=x | 0x0f; (低4位置1)
x 1010 0101 | 0000 1111

大学课件C语言第十二章位运算

大学课件C语言第十二章位运算

00 00 00 01 00 11 00 10
printf(“%d”,c);
>> 右移位 (算术移位)
1 01 10 01 0 10 1 1 1 01 0 0 0 0 10 1
2024/7/18
位段(位域)
struct bitseg { unsigned a: 2 ; unsigned b: 4 ; unsigned c: 6 ; unsigned d: 4 ; } bits1 , bits2 ;
~ 取反
~ 00000101
char c=5;
11111010
printf (“%d”, ~c); /*考虑补码*/
2024/7/18
位可&运构=、算成|具符如=2、种有和下>字移赋复>=位位值合、移的运赋<<位特算值=、运点符运∧算结算=符合符
<< 左移位(逻辑移位) char c=5;c=c<<2;
利用位运算实现大小写字母的转换
编程思路:大小写字母的ASCII码的差值为 32=25=(100000)2,即 ‘A’ +32= ‘a’, ‘A’: 01000001 ‘a’ : 01100001 它们的差别在右起第 6 位,在大写字母的该
位上置 1 即变为对应的小写字母,在小写字母的 该位上置 0 则变为相应的大写字母。
#include<stdio.h> main()
注:0xdf=(df)16=(11011111)2
{ int i; char c [ 80];
printf(″input a string\n ″); scanf(″%s ″,c);
for (i=0;i<80;i++)

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

谭浩强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章位运算

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.一个位段必须存储在同一存储单元中,不能跨两个单元。 如果第一个单元空间不能容纳下一个位段,则该空间不用,而 从下一个单元起存放该位段。

位运算

位运算
第12章 位运算
一、位运算符和位运算
1、按位与运算 符号:& 运算方式: 仅有 1&1=1 例如: a=3,b=-3,c=a&b (1) 0000000000000011 & 1111111111111101 0000000000000001 功能:取一个存储单元的某几位 使特定位清零
2、按位或运算 符号:| 运算方式:仅有0|0=0,否则全为1 例如: a=3,b=-3,c=a|b (-1) 0000000000000011 | 1111111111111101 1111111111111111 功能:使特定位置1
5、左移运算 符号: << 例如:a=3,b=a<<2 a 0000000000000011 b 0000000000001100 左移一位,相当于;> 例如:a=8,b=a>>2 a 0000000000001000 8 b 0000000000000010 2 右移一位,相当于除2运算 注意:系统在右移时,左端补符号位
3、异或运算 符号:^ 运算方式:相同为0 相异为 1
例如: a=3,b=-3,c=a^b (-2) 0000000000000011 ^ 1111111111111101 1111111111111110 功能:使特定位取反(与1异或) 4、取反运算 符号 :~ (单目运算) 例如: a=3, b=~a (-4) a 0000000000000011 3 b 1111111111111100 -4
为运算符的优先级: ~ ----- << >>------ & ------ ^ ------- | 二、位运算举例 1 、写出下列程序运行结果 main() {unsigned a,b,x a=0x255; b=a<<4; x=~b&0xff; printf(“%o”,x); }

全国计算机二级C语言课件 第12章 位运算

全国计算机二级C语言课件  第12章  位运算
答案:C 4、变量 a 中的数据用二进制进表示的形式是 01011101,变量 b 中 的数据用二进制表示 的形式是11110000,若要求将a 的高4 位取反,低4 位不变,所要执 行的运算是( )。 A)a^b B)ab C)a&b D)a<<4 答案:A
4.位运算符的优先级 (1)位反(~)运算符为单目运算符,优 于所有的双目运算符和三目运算符。 (2)位移位运算符优先级相同,比算术运 算符的优先级低,比关系运算符的优先级高。 (3)位逻辑运算符的优先级比关系运算符 的优先级低,比逻辑运算符的优先级高。 (4)3个位逻辑运算符的优先次序为:& 优 于 ^ 优于 |。 (5)位自反值运算符和赋值运算符、算术 自反值运算符是同级的。
第12章 位运算
本章要点:

12.1 位运算符 12.2 位运算符的运算功能
12.1 位运算符
1.数在计算机中的存放形式
(1)字和字节 (2)原码 (3)补码
2.位运算符 所谓位运算是指进行二进制位的运算。 C语言提供了六种位运算符
表12.1 C语言中的位运算符
运算符 & | ^ ~ << >> 名称 按位与 按位或 按位异或 按位取反 左移 右移 示例 a&b a|b a^b ~a a<<2 a>>3 示例说明 a和b位与 a和b位或 a和b位异或 求a的位反 a左移2位 a右移3位 优先次序 从左向右 从左向右 从左向右 从右向左 从左向右 从左向右
考题讲解
1、
答案:A 2、若有以下程序段 int r=8; printf("%d\n",r>>1); 输出结果是( )。 A)16 B)8 C)4 D)2 答案:C
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

位操作符
C语言提供的位操作符有按位与&、按位或|、按位异或 语言提供的位操作符有按位与& 按位或|、按位异或 |、 ^、取反~、左移<<和右移>>。 取反~ 左移<<和右移>>。 <<和右移>> 位操作符的操作数仅限整型(字符型), 位操作符的操作数仅限整型(字符型), 为简明下面示例中位操作符的操作数多为字符型。 为简明下面示例中位操作符的操作数多为字符型。
结构体中的结构体
结构体struct bitfield虽然有三个整型成员a,b,c,但 虽然有三个整型成员a,b,c, 结构体struct bitfield虽然有三个整型成员a,b,c,但 它们存储空间的长度只有2 它们存储空间的长度只有2位、4位和2位。 位和2 特别强调,整型成员a 特别强调,整型成员a、b、c虽然位数不多,但仍为有 虽然位数不多, 符号数, 符号数,即a、c的取值范围为-2至1,b的取值范围为-8至 的取值范围为的取值范围为7。
新编C语言程序设计教程
清华大学出版社
周二强
zeq@ 软件学院
计算机科学与工程系
配套视频: 配套视频: 博客: 博客:/stunt
第12章 位运算 12章
12. 12.1 位操作符
12.1.1 按位与操作符& 12.1.2 按位或操作符| 12.1.3 异或操作符^ 12.1.4 取反操作符~ 12.1.5 左移操作符<< 12.1.6 右移操作符>>
12. 12.2 位运算示例 12. 12.3 位段
位运算
位运算是指按二进制位进行的运算, 位运算是指按二进制位进行的运算,实际上就是直接对整数 在内存中的二进制位进行操作。 在内存中的二进制位进行操作。 考虑这样的问题:编程控制编号为0 考虑这样的问题:编程控制编号为0至7的八盏灯的开关。 的八盏灯的开关。 可以定义一个长度为8的短整型数组变量a。 可以定义一个长度为8的短整型数组变量a 可以定义一个无符号的字符型变量c 可以定义一个无符号的字符型变量c。 如果c的值为128( 0000), ),则 号灯亮,其余灯灭; 如果c的值为128(1000 0000),则7号灯亮,其余灯灭;为 128 192时 0000), ),则 号和7号灯亮,其余的灭。 192时(1100 0000),则6号和7号灯亮,其余的灭。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。
例12-1 分析下面求整数绝对值 的函数
分析: 分析: 如果x>=0,则 的值为0 的结果仍为x 如果x>=0,则y的值为0,(x ^ y) - y 的结果仍为x。 x>=0, 如果x<0,则 的值为如果x<0,则y的值为-1,x与y进行异或运算实际上为对x进 x<0, 进行异或运算实际上为对x 行取反操作, 行取反操作,减y就是加1。x取反加1的结果就是x的相反数 就是加1 取反加1的结果就是x ,即-x。
return
左移操作符<< 12.1.5 左移操作符<<
左移操作符<<常用形式为: 左移操作符<<常用形式为:a << n <<常用形式为 其中, 其中,a和n均为整数,表达式求值时将a的二进制位全 均为整数,表达式求值时将a 部左移n 部左移n位,右端补n个0,左端移出的n位因溢出而舍弃。 右端补n 左端移出的n位因溢出而舍弃。 显然n的取值范围通常为1至sizeof(a)。 显然n的取值范围通常为1 sizeof(a)。 左移1位的值为a 左移1位的值为a的2倍,左移2位的值为a的4倍,……( 左移2位的值为a ……( 表达式的值不能超出整型的取值范围)。左移操作要比相 表达式的值不能超出整型的取值范围)。左移操作要比相 )。 应的乘法运算(a*2)快得多。 应的乘法运算(a*2)快得多。 在位运算中,左移运算常用于构造操作数。 在位运算中,左移运算常用于构造操作数。
注意:
按位与操作符也可以构成复合赋值操作符, 1. 按位与操作符也可以构成复合赋值操作符,即c = c 0x7f可改写为 可改写为c 0x7f。 & 0x7f可改写为c &= 0x7f。 利用按位与操作符对整型变量a的各位进行取舍时, 2. 利用按位与操作符对整型变量a的各位进行取舍时, 如果保留某位的值,则另一操作数的对应位值为1;如果 如果保留某位的值,则另一操作数的对应位值为1 清零,则对应位的值为0 清零,则对应位的值为0。 1、 0、 0、 1 & 1 = 1、1 & 0 = 0、0 & 1 = 0、0 & 0 = 0
构造操作数
无符号字符型变量c的值为165,需点亮第6号灯, 无符号字符型变量c的值为165,需点亮第6号灯,可以 165 用如下表达式 6,其中, 6即 0000。 c |= 1 << 6,其中,1 << 6即0100 0000。 注意: 注意: 左移操作也可看作算术运算, 左移操作也可看作算术运算,故其优先级低于算术操作 符但高于关系运算符。 符但高于关系运算符。 单目操作符~的优先级较高。按位与、 单目操作符~的优先级较高。按位与、按位或和按位异 或的优先级低于关系操作符,但高于逻辑操作符。 或的优先级低于关系操作符,但高于逻辑操作符。
return
按位与操作符& 12.1.1 按位与操作符&
按位与操作符&将参与运算的两个操作数, 按位与操作符&将参与运算的两个操作数,按二位进制 位进行“ 位进行“与”运算。与运算时,如果两个二进制位上的数 运算。与运算时, 均为1 则运算结果的相应位为1 均为1 ,则运算结果的相应位为1,否则运算结果的相应 位为0。即 位为0 1、 0、 0、 1 & 1 = 1、1 & 0 = 0、0 & 1 = 0、0 & 0 = 0 例如: 3, b的值为 的值为2 例如:char a = -2, b = 3,则a & b的值为2。
return
பைடு நூலகம்
按位或操作符| 12.1.2 按位或操作符|
按位或操作符|将参与运算的两个操作数, 按位或操作符|将参与运算的两个操作数,按二进制位 进行“ 进行“或”运算。或运算时,如果两个二进制位上的数都 运算。或运算时, 为0,则运算结果的对应位为0;否则,对应位为1。即 则运算结果的对应位为0 否则,对应位为1 1 | 1 = 1、1 | 0 = 1、0 | 1 = 1、0 | 0 = 0。 1、 1、 1、 0。 由运算规则可知,利用按位或操作符| 由运算规则可知,利用按位或操作符|可以很容易地在 不影响其它位的情况下将一个整数的某位设置为1 不影响其它位的情况下将一个整数的某位设置为1。 例如,无符号字符型c的值为165,需点亮1号灯时, 例如,无符号字符型c的值为165,需点亮1号灯时,只 165 要让c 0x2作按位或运算即可。 要让c与0x2作按位或运算即可。c |= 0x2 作按位或运算即可
按位与操作符&
从按位与操作符&的运算规则可知,利用按位与操作符& 从按位与操作符&的运算规则可知,利用按位与操作符& 可以很容易地在不影响其它位的情况下将一个整数的某位 设置为0 设置为0。 例如,无符号字符型c的值为165(1010 0101),即现 0101), ),即现 例如,无符号字符型c的值为165( 165 在是第0 在是第0、2、5、7号灯亮。需熄灭第七号灯时, 号灯亮。需熄灭第七号灯时, 只要让c 0x7f( 1111)进行按位与运算即可。 只要让c与0x7f(0111 1111)进行按位与运算即可。
return
12.1.3 异或操作符^
异或操作符^也称xor操作符。 异或” 异或操作符^也称xor操作符。“异或”指参与运算的两个二 xor操作符 进制位是否为异(不同),不同时结果为1 进制位是否为异(不同),不同时结果为1(真),相同时结 ),不同时结果为 ),相同时结 果为0 果为0(假)。即 )。即 1 ^ 1 = 0、1 ^ 0 = 1、0 ^ 1 = 1、0 ^ 0 = 0。 0、 1、 1、 0。 分析运算规则可知,某位与1进行异或运算时, 分析运算规则可知,某位与1进行异或运算时,结果与该位正 好相反(翻转),即 好相反(翻转),即1变0,0变1;某位与0进行异或时,结果 ), 某位与0进行异或时, 与该位相同。 与该位相同。 例如,无符号字符型c的值为165,需把第0 例如,无符号字符型c的值为165,需把第0到3号灯的状态进 165 行翻转时即亮的灭,灭的亮,只要让c 0xf作异或操作即可。 行翻转时即亮的灭,灭的亮,只要让c与0xf作异或操作即可。 作异或操作即可 return c ^= 0xf
取反操作符~ 12.1.4 取反操作符~
取反操作符是一个单目操作符, 取反操作符是一个单目操作符,用来对一个整数按二进 制位取反, 制位取反,即0变1,1变0。 例如,无符号字符型c的值为165, 例如,无符号字符型c的值为165,需把所有灯的状态进 165 行翻转时,只要让进行取反操作即可。c = ~c。 ~c。 行翻转时,只要让进行取反操作即可。 整数a的相反数可以表示为~a 1。 整数a的相反数可以表示为~a + 1。 因为~a等价于-1-a,故~a+1的值为-1-a+1为-a。 因为~a等价于~a+1的值为- a+1为 ~a等价于 的值为
return
右移操作符>> 12.1.6 右移操作符>>
右移操作符与左移操作符类似,表达式a n求值时 求值时, 右移操作符与左移操作符类似,表达式a >> n求值时, 会将a的二进制位全部右移n 会将a的二进制位全部右移n位,右端移出的n位因溢出而 右端移出的n 被舍弃。 被舍弃。 根据左端移入数的不同,右移操作分为“逻辑右移”和 根据左端移入数的不同,右移操作分为“逻辑右移” “算术右移”两种。 算术右移”两种。 逻辑右移时,无论a为何类型,左端均移入n 逻辑右移时,无论a为何类型,左端均移入n个0;算术 右移时,如果a为无符号数,则左端移入n 右移时,如果a为无符号数,则左端移入n个0;如果a为有 如果a 符号数,则左端移入的数为a的符号位, 符号数,则左端移入的数为a的符号位,即a为正数时移入 0,a为负数时移入1。TC和VC6.0中均采用算术右移。 为负数时移入1 TC和VC6.0中均采用算术右移。 中均采用算术右移
相关文档
最新文档