C++知识点总结(31):位运算、进制转换

一、前言

位运算和进制转换都是非常热门的题目。在 CCF CSP-J/SGESP 初赛的时候有选择题,其中大规模的就是位运算和进制转换。根据近 10 10 10 年的调查情况,有接近 10 % 10\% 10% 的题目考察位运算,有接近 30 % 30\% 30% 的题目考察进制转换。

二、位运算

1. 按位与 &

例题: ( 1101101 ) 2 & ( 101001 ) 2 = ( 0101001 ) 2 (1101101)_2 \& (101001)_2=(0101001)_2 (1101101)2&(101001)2=(0101001)2

数字11101101
数字20101001
结果0101001

技巧:全 1 1 1 1 1 1,一 0 0 0 0 0 0

2. 按位或 |

例题: ( 1101101 ) 2 ∣ ( 101001 ) 2 = ( 1101101 ) 2 (1101101)_2 | (101001)_2=(1101101)_2 (1101101)2(101001)2=(1101101)2

数字11101101
数字20101001
结果1101101

技巧:全 0 0 0 0 0 0,一 1 1 1 1 1 1

3. 按位异或 ^

例题: ( 1101101 ) 2 (1101101)_2 (1101101)2 ^ ( 101001 ) 2 = ( 1000100 ) 2 (101001)_2=(1000100)_2 (101001)2=(1000100)2

数字11101101
数字20101001
结果1000100

技巧:一 1 1 1 1 1 1,否则为 0 0 0

4. 按位取反 ~

例题:   ( 1101101 ) 2 = ( 0010010 ) 2 ~ (1101101)_2=(0010010)_2  (1101101)2=(0010010)2

数字1101101
结果0010010

技巧: 1 1 1 0 0 0,否则为 1 1 1

5. 按位左移 <<

例题: ( 1101101 ) 2 < < ( 2 ) (1101101)_2 << (2) (1101101)2<<(2) 10 10 10 = ( 110110100 ) 2 =(110110100)_2 =(110110100)2
技巧:左移 n n n 位就添 n n n 0 0 0

6. 按位右移 >>

例题: ( 1101101 ) 2 > > ( 2 ) (1101101)_2 >> (2) (1101101)2>>(2) 10 10 10 $
技巧:右移 n n n 位就取前 n n n

三、进制转换

1. 二进制数计算

1 1 1 ( 101 ) 2 + ( 11 ) 2 = ( 1000 ) 2 (101)_2+(11)_2=(1000)_2 (101)2+(11)2=(1000)2
【解析】
1 + 1 = 2 1+1=2 1+1=2,满 2 2 2 1 1 1,进 1 1 1 0 0 0
0 + 1 + 1 = 2 0+1+1=2 0+1+1=2,满 2 2 2 1 1 1,进 1 1 1 0 0 0
1 + 1 = 2 1+1=2 1+1=2,满 2 2 2 1 1 1,进 1 1 1 0 0 0


2 2 2 ( 101 ) 2 − ( 11 ) 2 = ( 10 ) 2 (101)_2-(11)_2=(10)_2 (101)2(11)2=(10)2
【解析】
1 − 1 = 0 1-1=0 11=0,写 0 0 0
0 − 1 0-1 01 不够减,向前借 1 1 1 2 2 2 2 − 1 = 1 2-1=1 21=1,写 1 1 1


2011 − 2011- 2011CSP-J:在二进制下, 1010110 + x = 1100011 1010110+x=1100011 1010110+x=1100011,求 x x x
【解析】
1 − 0 = 1 1-0=1 10=1,写 1 1 1
1 − 1 = 0 1-1=0 11=0,写 0 0 0
0 − 1 0-1 01 不够减,向前借 1 1 1 2 2 2 2 − 1 = 1 2-1=1 21=1,写 1 1 1
( − 1 ) − 0 (-1)-0 (1)0 不够减,向前借 1 1 1 2 2 2 2 − 1 = 1 2-1=1 21=1,写 1 1 1
再往前,全部都是 0 0 0

2. 十进制转 x 进制

2.1 十进制转二进制

1 1 1 ( 12 ) (12) (12) 10 10 10 = ( ? ? ) 2 =(??)_2 =(??)2
【方法】 不断地用数字除以 2 2 2,将余数逆序输出
【解析】

操作结果余数
12 ÷ 2 12\div2 12÷2 6 6 6 0 0 0
6 ÷ 2 6\div2 6÷2 3 3 3 0 0 0
3 ÷ 2 3\div2 3÷2 1 1 1 1 1 1
1 ÷ 2 1\div2 1÷2 0 0 0 1 1 1

所以 ( 12 ) (12) (12) 10 10 10 = ( 1100 ) 2 =(1100)_2 =(1100)2


2 2 2 ( 0.125 ) (0.125) (0.125) 10 10 10 = ( ? ? ) 2 =(??)_2 =(??)2
【方法】 不断用得到的数字乘 2 2 2,结果超 0 0 0,那么整数部分变成 0 0 0,顺序输出
【解析】

操作结果取整
0.125 × 2 0.125\times2 0.125×2 0.25 0.25 0.25 0 0 0
0.25 × 2 0.25\times2 0.25×2 0.5 0.5 0.5 0 0 0
0.25 × 2 0.25\times2 0.25×2 1 1 1 1 1 1

所以 ( 0.125 ) (0.125) (0.125) 10 10 10 = ( 0.001 ) 2 =(0.001)_2 =(0.001)2


2.2 十进制转八进制

1 1 1 ( 15 ) (15) (15) 10 10 10 = ( ? ? ) 8 =(??)_8 =(??)8
【方法】 不断地用数字乘 8 8 8,将余数逆序输出
【解析】

操作结果余数
15 ÷ 8 15\div8 15÷8 1 1 1 7 7 7
1 ÷ 8 1\div8 1÷8 1 1 1 1 1 1

所以 ( 15 ) (15) (15) 10 10 10 = ( 17 ) 8 =(17)_8 =(17)8


2 2 2 ( 0.625 ) (0.625) (0.625) 10 10 10 = ( ? ? ) 8 =(??)_8 =(??)8
【方法】 不断地用数字除以 8 8 8,结果超 0 0 0,那么整数部分变成 0 0 0,顺序输出
【解析】

操作结果取整
0.625 × 8 0.625\times8 0.625×8 5.0 5.0 5.0 5 5 5

所以 ( 0.625 ) (0.625) (0.625) 10 10 10 = ( ? ? ) 8 =(??)_8 =(??)8

2.3 十进制转十六进制

例题:保留两位小数: ( 257.12 ) (257.12) (257.12) 10 10 10 = ( ? ? ) =(??) =(??) 16 16 16
【方法】 分开算
【解析】

操作结果余数/取整
257 ÷ 16 257\div16 257÷16 16 16 16 1 1 1
16 ÷ 16 16\div16 16÷16 1 1 1 0 0 0
1 ÷ 16 1\div16 1÷16 0 0 0 1 1 1
======
0.12 × 16 0.12\times16 0.12×16 1.92 1.92 1.92 1 1 1
0.92 × 16 0.92\times16 0.92×16 14.72 14.72 14.72 14 14 14 D D D

3. x 进制转十进制

【方法】 位权展开求和
【解释】 按照每个数位所处的位置所对应的数值乘当前选中的一个数字,求这些结果的和

3.1 二进制转十进制

例题: ( 1011.01 ) 2 (1011.01)_2 (1011.01)2
方法:
( 1011.01 ) 2 = ( 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 + 0 × 2 (1011.01)_2=(1\times2^3+0\times2^2+1\times2^1+1\times2^0+0\times2 (1011.01)2=(1×23+0×22+1×21+1×20+0×2 − 1 -1 1 + 1 × 2 +1\times2 +1×2 − 2 -2 2 ) ) ) 10 10 10
= ( 8 + 0 + 2 + 1 + 0 + 0.25 ) =(8+0+2+1+0+0.25) =(8+0+2+1+0+0.25) 10 10 10
= ( 11.25 ) =(11.25) =(11.25) 10 10 10

3.2 八进制转十进制

例题: ( 17.2 ) 8 (17.2)_8 (17.2)8
方法:
( 17.2 ) 8 = ( 1 × 8 1 + 7 × 8 0 + 2 × 8 (17.2)_8=(1\times8^1+7\times8^0+2\times8 (17.2)8=(1×81+7×80+2×8 − 1 -1 1 ) ) ) 10 10 10
= ( 8 + 7 + 2 8 ) =(8+7+\frac{2}{8}) =(8+7+82) 10 10 10
= ( 15.25 ) =(15.25) =(15.25) 10 10 10

3.2 十六进制转十进制

例题: ( 10 F . 8 ) (10F.8) (10F.8) 16 16 16
方法:
( 10 F . 8 ) (10F.8) (10F.8) 16 16 16 = ( 1 × 1 6 2 + 0 × 1 6 1 + 15 × 1 6 0 + 8 × 16 =(1\times16^2+0\times16^1+15\times16^0+8\times16 =(1×162+0×161+15×160+8×16 − 1 -1 1 ) ) ) 10 10 10
= ( 256 + 0 + 15 + 8 16 ) =(256+0+15+\frac{8}{16}) =(256+0+15+168) 10 10 10
= ( 271.5 ) =(271.5) =(271.5) 10 10 10

4. x 进制转 y 进制

4.1 八进制和二进制

熟记下表:

八进制二进制
0000
1001
2010
3011
4100
5101
6110
7111

1 1 1 ( 245.206 ) 8 = ( ? ? ) 2 (245.206)_8=(??)_2 (245.206)8=(??)2
方法:

八进制二进制
2010
4100
5101
..
2010
0000
6110

所以, ( 245.206 ) 8 = ( 010100101.010000110 ) 2 (245.206)_8=(010100101.010000110)_2 (245.206)8=(010100101.010000110)2


2 2 2 ( 10100101.01000011 ) 2 = ( ? ? ) 8 (10100101.01000011)_2=(??)_8 (10100101.01000011)2=(??)8
方法:
第一步,前添零,后添零(整数部分、小数部分的长度添到 3 3 3 的倍数)。
( 10100101.01000011 ) 2 = ( 010100101.010000110 ) 2 (10100101.01000011)_2=(010100101.010000110)_2 (10100101.01000011)2=(010100101.010000110)2

第二步,对表。

二进制八进制
0102
1004
1015
..
0102
0000
1106

4.2 十六进制和二进制

熟记下表:

十六进制二进制十六进制二进制
0000081000
1000191001
20010101010
30011111011
40100121100
50101131101
60110141110
70111151111

1 1 1 ( 72.2 ) (72.2) (72.2) 16 16 16 = ( ? ? ) 2 =(??)_2 =(??)2
方法:

十六进制二进制
70111
20100
..
20100

所以, ( 72.2 ) (72.2) (72.2) 16 16 16 = ( 1110100.0100 ) 2 =(1110100.0100)_2 =(1110100.0100)2


2 2 2 ( 1110010.001 ) 2 = ( ? ? ) (1110010.001)_2=(??) (1110010.001)2=(??) 16 16 16
方法:
第一步,前添零,后添零(整数部分、小数部分的长度添到 4 4 4 的倍数)。
( 1110010.001 ) 2 = ( 01110010.0010 ) 2 (1110010.001)_2=(01110010.0010)_2 (1110010.001)2=(01110010.0010)2

第二步,对表。

二进制十六进制
01117
00102
..
00102

所以, ( 1110100.0100 ) 2 (1110100.0100)_2 (1110100.0100)2 = ( 72.2 ) =(72.2) =(72.2) 16 16 16

总结

1. 十进制转 x x x 进制的方法

【整数部分】

  1. 10 10 10 进制数不断除以 x x x,得到商和余数。
  2. 如果除到 0 0 0 了,那么将余数逆序输出就是结果。

例如 ( 36 ) 10 = ( ? ? ) 4 (36)_{10}=(??)_{4} (36)10=(??)4
36 ÷ 4 = 9......0 36\div4=9......0 36÷4=9......0
9 ÷ 4 = 2......1 9\div4=2......1 9÷4=2......1
2 ÷ 4 = 0......2 2\div4=0......2 2÷4=0......2
所以, ( 36 ) 10 = ( 210 ) 4 (36)_{10}=(210)_{4} (36)10=(210)4

【小数部分】

  1. 10 10 10 进制数不断乘 x x x,得到积和整数部分。
  2. 如果乘到了整数或者题目要求的精度,那么将整数部分顺序输出就是结果。

注意:

  1. 结果有的时候要补 “ 0. 0. 0.”。
  2. 在乘的结果是有整数部分的时候,下次的一个因数就只取小数部分。

例如 ( 0.36 ) 10 = ( ? ? ) 5 (0.36)_{10}=(??)_{5} (0.36)10=(??)5
0.36 × 5 = 1.8 取 1 0.36\times5=1.8取1 0.36×5=1.81
0.8 × 5 = 4.0 取 4 0.8\times5=4.0取4 0.8×5=4.04
所以, ( 0.36 ) 10 = ( 0.19 ) 5 (0.36)_{10}=(0.19)_{5} (0.36)10=(0.19)5

2. x x x 进制转十进制的方法

  1. 将给定的 x x x 进制数从左到右逐位乘对应的位权,得到相应的 10 10 10 进制数。
  2. 将各个积求和,得到转换后的 10 10 10 进制数。

例如 ( 123.321 ) 5 = ( ? ? ) 10 (123.321)_{5}=(??)_{10} (123.321)5=(??)10
1 × 5 2 + 2 × 5 1 + 3 × 5 0 + 3 × 5 − 1 + 2 × 5 − 2 + 1 × 5 − 3 = 38.688 1\times5^2+2\times5^1+3\times5^0+3\times5^{-1}+2\times5^{-2}+1\times5^{-3}=38.688 1×52+2×51+3×50+3×51+2×52+1×53=38.688

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值