二进制二进制

近3年初赛考察:

题号 题型 分值
2020 第9题 单项选择 2分
2021 第3题

难易度:中等

计算机使用二进制,每一位上的数字由0和1组成。

为什么计算机选择二进制

1.很难在一种物质上体现十种不同的状态,即使表示出来也很容易出错

2.电线的高、低电平(电压)表示两种状态非常方便,并且不容易出错

二进制下的加减运算

二进制的加减法与十进制类似,加法时:十进制为逢十进一,二进制是逢二进一;减法时:十进制是借一当十,二进制是借一当二。

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps1.jpg)

1.二进制数 00100100 和 00010100 的和是( )。

A.00101000 B.01100111 C.01000100 D.00111000

2.在二进制下,1011001 + ( ) =1100110。

A. 1011 B. 1101 C. 1010 D. 1111

十进制和二进制下的加、减法有什么不同呢?

进位不同 逢十进一、逢二进 ..一

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps2.jpg)![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps3.jpg)

借位不同 借一当十、借一当二

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps4.jpg)![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps5.jpg)

十进制转二进制

整数部分短除法、小数部分短乘法

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps6.jpg)![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps7.jpg)

二进制转十进制

每位数字乘以它的权重累加到一起。

**1.**如何计算权重 二进制位权为2^{(数位-1)}2(数位−1)

**2.**如何转换十进制 sum += a[i] * w

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps8.jpg)

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps9.jpg)

原码、反码和补码

机器数

与普通二进制数不同,最高位作为符号位,1表示负数,0表示正数,其余位数表示真值。

原码

原码就是用第一位表示符号,其余位表示值。比如如果是8位二进制:

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps10.jpg)

反码

反码的表示方法是:

正数的反码是其本身。

负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps11.jpg)

补码

补码的表示方法是:

正数的补码就是其本身。

负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps12.jpg)

既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?

电脑计算减法是转换成加法进行计算,且符号位参与到运算中。 但是:

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps13.jpg)

所以为了解决减法转换加法错误的问题,反码出现了。 但是:

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps14.jpg)

为了解决-0的问题,出现了补码。并且把-0的编码作为数字范围内的最小值,所以数字范围增加了1个。****

8位机器数能表示的数据范围: -128 ~ 127

32位机器数能表示的数据范围: -2147483648 ~ 2147483647

1.二进制数 1011 转换成十进制数是( ).

A. 11 B. 10 C. 13 D. 12

2.目前主流的计算机储存数据最终都是转换成( )数据进行储存。

A.二进制 B.十进制 C.八进制 D.十六进制

3.在二进制下,1011001+()=1100110。

A. 1011 B. 1101 C. 1010 D. 1111

4.二进制数 00100100 和 00010101 的和是( )。

A. 00101000 B. 001010100 C. 01000101 D. 00111001

5.二进制数 00100100 和 00010100 的和是( )。

A.00101000 B.01100111 C.01000100 D.00111000

6.二进制数 00101100 和 00010101 的和( ).

A. 00101000 B. 01000001 C. 01000100 D. 00111000

7.在 8 位二进制补码中,10101011 表示的数是十进制下的( ).

A. 43 B. -85 C. -43 D. -84

8.二进制数 11.01 在十进制下是( ).

A. 3.25 B. 4.125 C. 6.25 D. 11.125

9.二进制数101.11对应的十进制数是( )。

A.6.5 B.5.5 C.5.75 D.5.25

10.十进制小数 13.375 对应的二进制数是( )。

A. 1101.011 B. 1011.011 C. 1101.101 D. 1010.01

11.一个自然数在十进制下有n位,则它在二进制下的位数与( )最接近。

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps15.jpg)

进制转换

近3年初赛考察:

题号 题型 分值
2020 第17题 阅读程序 13.5分
第13题 单项选择 2分

难易度:中等

不同的进制

在计算机中,除二进制外,比较常用的还有八进制和十六进制。

进制 基数 进位原则 基本符号
二进制(B) 2 逢2进1 0,1
八进制(O) 8 逢8进1 0~7
十进制(D) 10 逢10进1 0~9
十六进制(H) 16 逢16进1 0~ 9,A ~ F

Warning!

易错点:十六进制中的 A相当于十进制中的 1010。

进制转换

1. 十进制转化成K进制

(1)整数部分

短除法,除K取余,直到商是00,余数从下到上输出,即为K进制的整数部分。

例:十进制199199转化成八进制

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps16.jpg)

(2)小数部分

乘K取整,直到小数部分是00或达到指定精度,整数部分从上到下输出,即为K进制的小数部分。

例:十进制0.31250.3125转化成八进制

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps17.jpg)

Warning!

绝大部分浮点数无法用二进制精确表示,如 0.1。

2. K****进制转化成十进制

每一位上的数字乘以对应的位权,整数部分位权是K^(数位−1),小数部分的权分别为K^-1、K^-2 …

千位 百位 十位 个位 . 十分位 百分位
数字 22 00 33 22 . 11 22
位权 K^3 K^2 K^1 K^0 K^-1 K^-2

例:八进制2032.122032.12转换成十进制

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps18.jpg)

负数次幂

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps19.jpg)

3. 二、八、十六进制之间的转换

一个八进制位可以用 3 个二进制位来表示(2^3 = 8),一个十六进制位可以用 4个二进制位来表示(2^4 = 16),反之同理。

十进制 二进制 八进制 十六进制 十进制 二进制 八进制 十六进制
0 8 1000 10 8
1 9 1001 11 9
2 10 2 10 1010 12 A
3 11 3 11 1011 13 B
4 100 4 12 1100 14 C
5 101 5 13 1101 15 D
6 110 6 14 1110 16 E
7 111 7 15 1111 17 F

例:

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps20.jpg)

程序实现将n进制数转换成m进制。

//将n进制数字num,转换成m进制数

//(其中2 <= n,m <= 16,n进制数对应的十进制的值不超过int范围)

#include <iostream>

#include <string>

using namespace std;

int main() {

int n, m;

string num;

cin >> n >> num >> m;

//n进制num转换成十进制数ans

int ans = 0, w = 1;

int len = num.length();

for (int i = len - 1; i >= 0; i--){

if ('A' <= num[i] && num[i] <= 'F'){

	ans = ans + (num[i] - 'A' + 10) \* w; 

} else {

	ans = ans + (num[i] - '0') \* w;

}

w \*= n;

Copy

}

//十进制数ans转换成m进制

char mnum[100] = {}, cnt = 0;

while (ans != 0){

int tmp = ans % m;

if (tmp >= 10){

	mnum[cnt++] = tmp - 10 + 'A';

}else{

	mnum[cnt++] = tmp + '0';

}

ans /= m;

Copy

}

for (int i = cnt - 1; i >= 0; i--){

cout << mnum[i];

Copy

}

return 0; }

练习题目:

#include <iostream>

using namespace std;

long long n, ans;

int k, len;

long long d[1000000];

int main() {

cin >> n >> k;

d[0] = 0;

len= 1;

ans = 0;

for (long long i = 0; i <n; ++i) {

++d[0];

for (int j = 0; j + 1<len; ++j) {

	if (d[j] == k) {

		d[j] = 0;

		d[j + 1] += 1;

		++ans;

	}

}

if (d[len - 1] == k) {

	d[len - 1] = 0;

	d[len] =1;

	++len;

	++ans;

}

Copy

}

cout << ans << endl;

return 0; }

假设输入的 n 是不超过 2^62的正整数,k都是不超过 10000 的正整数,完成下面的判断题和单选题:

•判断题 1)若 k=1,则输出 ans 时,len=n。( ) 2)若 k>1,则输出 ans时,len—定小于 n。( ) 3)若 k>1,则输出 ans时,k^len—定大于n。( )

•单选题 4)若输入的 n 等于:10^15,输入的 k为 1,则输出等于( )。 5)若输入的 n 等于205,891,132,094,649(即 3^30),输入的 k为 3,则输出等于( )。 6)若输入的 n 等于 100,010,002,000,090,输入的 k为 10,则输出等于( )。 1. A. 正确 B. 错误 2. A. 正确 B. 错误 3. A. 正确 B. 错误 4. ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps21.jpg) 5. ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps22.jpg) 6. A. 11,112,222,444,543 B. 11,122,222,444,453 C. 11,122,222,444,543 D. 11,112,222,444,453

1.八进制数 32.1 对应的十进制数是( )。

A. 6.5 B. 5.5 C. 5.75 D. 5.25

2.二进制数101.11对应的十进制数是( )。

A.6.5 B.5.5 C.5.75 D.5.25

3.十进制小数 13.375 对应的二进制数是( )。

A. 1101.011 B. 1011.011 C. 1101.101 D. 1010.01

4.下列四个不同进制的数中,与其它三项数值上不相等的是( )。

A. (269)16 B. (617)10 C. (1151)8 D.(1001101011)2

位运算

近3年初赛考察:

题号 题型 分值
2021 第16题第3、4、5、6小题 阅读程序 7.5分
第17题 14分
2022 第16题第3、4、5小题 4.5分

难易度:中等

2023年备考建议

站在出题人的视角,位运算在普及组也是属于不是很容易在复赛中考察的内容,但是放在初赛的阅读程序中却能很方便的提高区分度,即会位运算和不会的。也能通过位运算的考察,来考察学生对于二进制的理解,又很容易和编解码这类题做结合,简直不要太方便。所以命题者爱出,就要求大家掌握得很牢固。

除了位运算的一般用法,还要求掌握一些位运算的经典用法,比如lowbit运算,这样考场见到不用现场算,现场总结规律,就会得心应手。

作用于整数类型的运算对象,对二进制数位进行运算。

位与:& 当且仅当两个运算对象都为1时,该位为1

1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0

eg: 255 & 128 = 128

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps23.jpg)

位或:| 当且仅当两个运算对象都为0时,该位为0

1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0

eg: 255 | 128 = 255

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps24.jpg)

位取反:~ 将1置为0,将0置为1

~ 1 = 0 ~ 0 = 1

eg: ~ 128 = 127

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps25.jpg)

位异或:^ 当且仅当两个运算对象中只一个为1时,该位为1

1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0

eg: 255 ^ 128 = 127

![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml1600\wps26.jpg)

**左移: **<<

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

左边二进制位丢弃不包括1时, 左移1位相当于乘以2****。

eg: **3 << 2 = 12 (1100) **

**右移: **>>

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃.

右移1位相当于除以2****(整数除法)。

eg: 7 >> 1 变成 3,也就是111 >> 1 变成了 11。

18^125^125=()

A.127

B.143

C.18

D.125

位运算的性质

x ^ x = 0 : 自己与自己做异或一定为0

x ^ 0 = x : 一个数与0做异或还是它本身

位运算的应用:

Info

位运算的应用较多,写法种类也有多种。下面的应用,建议大家只是在本地都要运行一遍,加深记忆。

此外考场上难免会有不知道的位运算应用,这个时候,手算,对比,找规律,就是最好的方式。

取末位(x & 1) 可用来判断奇数、偶数

操作x的第j位(从右向左数,最右边是第0位)

x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值