C语言程序设计第12章(位运算).ppt
第十二章第十二章 位运算位运算 位运算是指进行二进制位的运算位运算是指进行二进制位的运算位运算是指进行二进制位的运算位运算是指进行二进制位的运算,即对字节或字节即对字节或字节即对字节或字节即对字节或字节内部的内部的内部的内部的二进制位二进制位二进制位二进制位进行运算。进行运算。进行运算。进行运算。计算机中是以计算机中是以计算机中是以计算机中是以补码形式补码形式补码形式补码形式存放数的存放数的存放数的存放数的.正数正数正数正数:原码原码原码原码,反码反码反码反码,补码相同补码相同补码相同补码相同.负数的补码负数的补码负数的补码负数的补码:符号位不变,数值位按位取反加符号位不变,数值位按位取反加符号位不变,数值位按位取反加符号位不变,数值位按位取反加1 1 如如如如:+7+7:-7:-7:0000011111111001一一.位运算符位运算符参加位运算参加位运算数据类型数据类型:有符号和无符号的整型数有符号和无符号的整型数(包括包括:char、short int、long unsigned)位运算符共位运算符共 6 种:种:&|1.1.(按位取反运算符按位取反运算符按位取反运算符按位取反运算符)作用作用:对一个二进制数对一个二进制数逐位逐位取反。取反。注意注意注意注意:运算和运算和!运算的区别。运算的区别。的优先级与的优先级与+、-、!同级。结合性同级。结合性从右至左从右至左。如如:a=15则则 a例例例例12.1 main()12.1 main()int a=0,b=1;int a=0,b=1;printf(“%d,%d n”,printf(“%d,%d n”,aa ,bb););printf(“%d,%d n”,printf(“%d,%d n”,!a!a ,!b!b););运行结果运行结果运行结果运行结果:-1,-2-1,-2 1,0 1,000000000 000011111111111111110000a a000000000000000011111111111111110002.&(按位与运算按位与运算)作用作用:对参加运算的两个二进制数对参加运算的两个二进制数逐位进行逻辑与逐位进行逻辑与运算。运算。如如:a&b 规则规则:0&0=0,1&0=0,0&1=0,1&1=1 例如例如:a=1,b=-2,则则:a&b=0例例:main()int a=5,b=12,d;d=a&b;printf(“%d&%d=%dn”,a,b,d);输出输出:5&12=4 此例说明此例说明:a,b 两个操作数参加两个操作数参加&运算前后运算前后,其值不变。其值不变。000000010000000011111110111111110000000000000000aba&b3.|(按位或运算按位或运算)作用作用:对参加运算的两个二进制数逐位进行逻辑或对参加运算的两个二进制数逐位进行逻辑或 运算。运算。如如:a|b 规则规则:0|0=0,1|0=1,0|1=1,1|1=1 例如例如:a=1,b=-1,则则:a|b=-1.000000010000000011111111111111111111111111111111aba|b4.(按位异或运算按位异或运算)作用作用:对参加运算的两个二进制数对参加运算的两个二进制数逐位逐位进行进行逻辑逻辑 异异 或或运算运算.如如:ab 规则规则:00=0,10=1,01=1,11=0例如例如:a=15,b=0,则则:ab=15000011110000000000000000000000000000111100000000abab例例:main()int a=3,b=4;a=ab;b=ba;a=ab;printf(“%d,%d”,a,b);输出输出:4,3结论结论:利用异或运算,可以设置第三个变量就可以利用异或运算,可以设置第三个变量就可以 实现实现 两个整型变量值的交换。两个整型变量值的交换。000000110000000000000100000000000000011100000000aba0000001100000000b0000010000000000a5.(左移位运算左移位运算)作用作用:将操作数的各个二进位顺序将操作数的各个二进位顺序左左移移。右端空右端空出的位出的位补补 0,而移出左端之外的位则舍去而移出左端之外的位则舍去。如如:a n表示将表示将a 的各个二进位顺序左移的各个二进位顺序左移 n 位位(n 为正整数为正整数)。例如例如:a=25 则则 a3 结果为结果为 200 00011001000000001100100000000000aa3说明说明:(1)左移运算相当于乘左移运算相当于乘 2 运算。运算。对对无符号数无符号数,左移,左移 1 位,相当于乘位,相当于乘 2。左移。左移 n 位,则乘位,则乘 2n。(2)对于用补码表示的正数,如果左移出的全部是对于用补码表示的正数,如果左移出的全部是 0,且移出后的最高位仍是,且移出后的最高位仍是0。(3)对于用补码表示的负数,如果左移出的全部是对于用补码表示的负数,如果左移出的全部是 1,且移出后的最高位仍是,且移出后的最高位仍是 1。如。如:11111110111111111111000011111111-2-2 30000111100000000按位取反取负号转换为按位取反取负号转换为10进制再减进制再减1 得得-16按位取反取负号再加按位取反取负号再加1 转换为转换为10进制得进制得-16(4)若非上述情况若非上述情况(如:左移出现溢出时如:左移出现溢出时),就不能,就不能简单地用简单地用 乘乘 2 来计算来计算.如如:有符号字符型数有符号字符型数 64,当它左移当它左移 2 位时,结果为位时,结果为 0。01000000640000000064 (右移运算符右移运算符)作用作用:将操作数的各个二进位顺序将操作数的各个二进位顺序右右移移。左端左端空出空出的位的位补补0 或或补补 1,而移出而移出右端右端之外的位则之外的位则舍去舍去.如如:a n 表示将表示将 a 的各个二进位顺序右移的各个二进位顺序右移 n 位位 说明说明:右移运算的结果与操作数的符号有关右移运算的结果与操作数的符号有关 1)对无符号数进行右移对无符号数进行右移,左端空出的位一律补左端空出的位一律补 0。2)对用补码表示的有符号数对用补码表示的有符号数,则随系统而定。则随系统而定。“逻辑右移逻辑右移”空位空位一律一律补补 0;“算术右移算术右移”正数右移,空位补正数右移,空位补 0;负数右移,负数右移,空位补空位补1 。(Turbo C中采用算术右移中采用算术右移)例如例如:a=-32768000000001000000000000000010000000000000011000000aa 1a 1逻辑右移逻辑右移,结果为结果为 16384算术右移算术右移,结果为结果为-16384 算术右移运算相当于除算术右移运算相当于除 2 运算运算。右移。右移 1 位,相当位,相当于除于除 2。右移。右移 n 位位,则除,则除 2n。二二.1.位运算符的优先级位运算符的优先级结合性结合性:运算按从右至左运算按从右至左,其余按从左至右其余按从左至右 例例:x&077 x&(077)x 2&y 2)&(y 3)2.复合赋值运算复合赋值运算&=,|=,=,=如如:a&=b a=a&b a=m+1 a=am+1&|高高低低(7 4+1)即即 a 4(2)设置一个低设置一个低 4位全为位全为 1,其余位全为其余位全为 0 的数的数.(0 4&(0 4;c=(0(mn+1)c=(0n)d=b&c 111100001111111100000000 00001111 例例12.3 将一个整数将一个整数a循环右移循环右移 n 位位。所谓循环右所谓循环右移是将移是将 a 最右端的位最右端的位顺序顺序移到移到a的最左端,而将的最左端,而将 a中原左端的各位顺序右移到最右端。中原左端的各位顺序右移到最右端。1 0 0 0 1 0 0 1右移右移 2 位位 0 1 1 0 0 0 1 0(1)将将 a 左移左移 16 n 位并存入变量位并存入变量 b 中中,这样这样 b 中最左中最左端的端的n位就是原位就是原 a 最右端的最右端的 n 位位。而。而 b 中最右端中最右端(16 n)位全为位全为 0。b=an(3)将将 c 与与 b 按位或运算按位或运算 c=c|b 0|0=0,1|0=111011111101010110110000000000000ab0001101111110101c0111101111110101cmain()unsigned a,b,c;int n;scanf(“%o,%d”,&a,&n);b=an;c=c|b;printf(“%on%on”,a,c);如输入如输入:157653,3 输出为输出为:157653 75765 同样可以实现循环左移同样可以实现循环左移.11011111101010110111101111110101