第十二章位逯算 第12章第1节 §121位运算符 位运算符及其优先性与结合性 位运算符—对整型和字符型数据,按其二进制的“位”进行运算。 & 按位与 位取反 按位或 左移 按位异或 右移 << 局 & 低 单目,右结合 双目,左结合 按位与运算& 都为1,结果为1; 按二进制位作逻辑“乘”。法则有一个为0,结果为。 例 3→→00..00011 3&8一800.01000结果:0注意:3&8→1 00.00000
第12章第1节 §12.1 位运算符 一. 位运算符及其优先性与结合性 & 按位与 ~ 位取反 | 按位或 > 右移 位运算符——对整型和字符型数据,按其二进制的“位”进行运算。 & ^ | > 高 ~ 低 单目,右结合 双目,左结合 二. 按位与运算& 按二进制位作逻辑“乘”。 法则:都为 1, 结果为1; 有一个为0,结果为0。 例: 3&8 3→ 00...00011 8→ 00...01000 00...00000 结果:0 注意: 3&&8 →1
第12章第1节 3 3&8→8-0100结果:8 00..01000 用途:1)清零。使某单元的所有位为0 参与运算的数:被清零的数中的位为1,则参与&运算的数的相应位为0 原数:50.0010 11..1101 16位 16位 00..00010 00..00100 5&2-0 5&4→0 2)取一个数中的某些指定位—参与运数的位为1 例a=1283取a的低8位 例a=1283取a的高8位 8位 8位 8位:8位 1283 00.010100000011 1283→00..010100000011 2 00.000011111l 65288 11.,1111000000 (3778 (177400)g &)00.000000+3 &)00.01010000001280 故:a&255-3 故:a&65288→1280 (a&0377-3) (a&0177400→1280)
第12章第1节 -3&8 3→ 11...11101 8→ 00...01000 00...01000 结果:8 用途: 1)清零。使某单元的所有位为0 2). 取一个数中的某些指定位 ——参与运数的位为1 参与运算的数:被清零的数中的位为1,则参与&运算的数的相应位为0 原数: 5 00...00101 -5 11...11011 2 00...00010 4 00...00100 5&2 →0 -5&4 →0 例 :a=1283,取a的低8位 1283 00...010100000011 00...000011111111 16位 16位 8位 8位 255 (377)8 &) 00...000000000011 3 故: a&255 →3 (a&0377 →3) 例 :a=1283,取a的高8位 1283 00...010100000011 11...111100000000 8位 8位 65288 (177400)8 &) 00...010100000000 1280 故: a&65288 →1280 ( a&0177400 →1280)
第12章第1节 二按位或运算 相当于逻辑加 法则:都为0,结果为0 有一个为1,结果为1 用途:对指定的位置1 a=13 0000000001 14 000000 )00000 5 故:a|14→15 按位“异或”运算(XOR)A 法则: 都相同(都为0或都为1),结果为0 不相同,结果为1 用途:1.使位翻转(即:1→0;0→1),参与运数的位为1 1^1→0;0^1→1
第12章第1节 二. 按位或运算| —— 相当于逻辑加 都为0,结果为0 有一个为1, 结果为1 用途: 法则: 对指定的位置1 a=13 00000000 00001101 置1 14 00000000 00001110 |) 00000000 00001111 15 故:a | 14 → 15 三. 按位“异或”运算(XOR) ^ 法则: 都相同 (都为0或都为1),结果为0 不相同, 结果为1 用途: 1. 使位翻转(即:1 →0; 0 →1), 参与运数的位为1 ∵ 1^1 →0 ; 0^1 →1
第12章第1节 13 00000 15 000000 )0010 故:13~15→2 2.保留原值(即:1→1;0→0),参与运数的位为0 1^0→1;0~0→0 13 00000001 000000 000000 3.交换两个值 a=a b 注:红色为原值 ta b=b^a;→b=b^a~b→→b=a~b^b→b=a^0→b a=b a=a b a=a^b^b→a=a^b^a→a=a^a^b a=0^b a=b
a=0^b a=b 2. 保留原值(即:1 →1; 0 →0), 参与运数的位为0 第12章第1节 ∵ 1^0 →1 ; 0^0 →0 13 00000000 00001101 15 00000000 00001111 ^ 00000000 00000010 ) 13 故: 13^15 →2 13 00000000 00001101 0 00000000 00000000 ^ 00000000 00001101 ) 3. 交换两个值 a b t=a; a=b; b=t a=a^b; b=b^a; b=b^a^b b=a^b^b b=a^0 b=a a=a^b; a=a^b^b a=a^b^a a=a^a^b 2 注:红色为原值
第12章第1节 四按位取反~(单目运算) 法则:原为0结果为1 原为1,结果为0 例:将一个数(13)最低位置0,其余不变 13-00000 可用下述方法计算: (0177776 ←-[1l 13&(-1) )0000000 五左移位运算< 例:如:a=3 00000000 <<2 0000000000 左移两位,高位(左边溢出,右边补零
第12章第1节 四. 按位取反 ~ (单目运算) 法则: 原为0 结果为1 原为1, 结果为0 例: 将一个数(13) 最低位置0, 其余不变 00000000 00001101 11111111 11111110 13 -2 (0177776) 00000000 00001100 &) 可用下述方法计算: 13&(~1) 11111111 11111110 五. 左移位运算<< 例: 如:a=3 a<<2 00000000 00000011 00000000 00001100 左移两位, 高位(左边)溢出, 右边补零
第12章第1节 六右移位运算> 如:a=5 0000000001 将a右移2位 a>>2 0000000 无符号数:左边补0 左边高位 的处理 原符号位为0(正数):左边补0 有符号数 原符号位为1左边补1(TC中,算术左移 (正数) 左边补0,逻辑左移 七复合赋值运算符 &= a&=b a=a&b a=b a=a b
六. 右移位运算>> 第12章第1节 a>>2 如:a=5 00000000 00000111 00000000 00000001 将a右移2位 左边高位 的处理 无符号数: 左边补0 有符号数: 原符号位为0( 正数): 左边补0 原符号位为1 ( 正数): 左边补1(TC中), 算术左移 左边补0,逻辑左移 七. 复合赋值运算符 &= |= >>= <<= ^= a&=b a=a&b a|=b a=a|b
第12章第2节 §122位运算举例 P303例题121取一个整数a从右端开始的47位 解法一 1514131211109876543210 2)取一数,后4位为1 00.01111—15 11..11111l 或:{(-0)>4&15或(a>4)&-(-0)>4 或:(a&(15>4
§12.2 位运算举例 第12章第2节 P303 例题12.1 取一个整数a从右端开始的4~7位 解法一 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 . 1) a>>4 2) 取一数, 后4位为1 00...01111 15 ~((~0)>4&15 或 (a>>4)&~((~0)>4 或: (a&(15>4 或:
第12章第2节 解法三 1).取一数:00.0011255或:~(-0)4 或:(a&-(-0)4 P308习题125设计一个函数,使给出一个数的原码,能得到该数的补码。 解:分析:1 ·最高位为1,其余各位取反+1 不变 取最高位:要用&运算 x&0100000 00000 表示8进制数 0100000则最高位为1→·则:(x^077701)010000 故:x&010000 →000000则最高位为0一不变 想想:用十进制数如何表示?
解法三. 第12章第2节 1). 取一数: 00..0011111111→255 或: ~((~0)>4 或: (a&~((~0)>4 P308 习题 12.5 设计一个函数, 使给出一个数的原码, 能得到该数的补码。 解: 分析: 1...... ...... 0...... ...... 最高位为1,其余各位取反+1 不变 取最高位: 要用&运算 x&0100000 表示8进制数 10000000 00000000 故: x&0100000 0100000 则最高位为1 0000000 则最高位为0 则:(x^077777+01)|0100000 不变 想想: 用十进制数如何表示?
第12章第2节 程序: maint unsigned int a; unsigned int f(unsigned int printf(“ input a data(8):”); scan(“%0”,&a); printf(“%0”,f(a); unsigned int unsigned int x Unsigned int y y=x0100000 if(y=010000 (x^077701)010000 或:y=(x+01)010000 rerurn(y); 补 输入:16666110000o 1001001001001010 111112 结果:111
第12章第2节 程序: main() {unsigned int a; unsigned int f(unsigned int); printf(“input a data(8): ”); scanf(“%o”, &a); printf(“%o”,f(a)); } unsigned int f(unsigned int x) {unsigned int y; y=x&0100000; if(y==0100000) y=(x^077777+01)|0100000; else y=x; rerurn(y); } 或:y=(~x+01)|0100000 输入:166666 1110110110110110 1001001001001010 补 111112 结果: 111112