单片机学习(2)

一:进制转换

1. 二进制转十进制:

计算方法:从右向左依次乘上2的n次幂,n从零开始,^符号表示次幂

1001 0110   1*2^7+0*2^6+0*2^5+1*2^4+0*2^3+1*2^2+1*2^1+0*2^0=150
1000 0000   -2^7     -128
1000 0010   -2^7+2^1  -126
0111 1111   2^7-1   127

2、十进制转二进制:
计算方法:十进制转二进制就是二进制转十进制的逆过程。
(逆序取整)

拿十进制150来举例。

150/2=75(余数为0)

75/2=37(余数为1)

37/2=18(余数为1)

18/2=9(余数为0)

9/2=4(余数为1)

4/2=2(余数为0)

2/2=1(余数为0)

1/2=0(余数为1)

整合为10010110即是转换的二进制。

常用十进制与二进制互换:

  二进制         十进制
0000 0100         4
0000 1000         8
0001 0000        16
0010 0000        32
0100 0000        64
1000 0000      -128
0111 1111       127
1111 1111        -1

3.二进制转十六进制:
首先需要4个二进制数各划分一个区域,不足时则补零(从左补零)。然后每个区域从右向左依次乘上2的n次幂,n从零开始,^符号表示次幂。合并得到的数就是转换后的十六进制数。
下图为十六进制数参考表格:
图片来源:@mez_Blog——进制之间的转换(二进制、八进制、十进制、十六进制)

拿二进制数1 0010 1100举例:
补零->0001 0010 1100
计算->  1    2    12(参考表格,12在十六进制中为C)
合并->  12C
即,转换成的十六进制数为12C.

参考文章:@mez_Blog—— 进制之间的转换(二进制、八进制、十进制、十六进制)


二、原码与补码的转换

正数:补码与原码一致,
负数:正数原码按位取反再加一

-96 ->96->0110 0000->1001 1111->1010 0000

三、字节数

char
字节数:1Byte=8bit ··········//1个字节,4位。

min: 1000 0000
      -128               //转化的十进制数
     -2^(8-1)            //计算过程
max:0111 1111
       127               //转化的十进制数
     2^(8-1)-1           //计算过程

unsigned char 无符号char
字节数:1Byte=8bit ··········//1个字节,4位。

min:0000 0000  
       0
max:1111 1111
       255              //转化的十进制数
      2^8-1             //计算过程

int
字节数:4Byte=32bit ··········//4个字节,32位。

min: -2^(32-1)
max: 2^(32-1)-1

unsigned int
字节数:4Byte=32bit ··········//4个字节,32位。

min: 0
max: 2^32-1

规律:

有符号的最大值为:2^(字节位数-1)-1;
有符号的最小值为:-2^(字节位数-1);

无符号的最大值为:2^字节位数-1;
无符号的最小值为:0;

浮点型

float (常用) 4B
double 8B

4.0    100.0
2.0     10.0
1.0      1.0
1.5      1.1
0.1      0.0001 100…

乘二取整法 (顺序取整)

0.1    0.0001 100…  

十进制数转换成二进制数是取不完的。
0.2    0
0.4    0
0.8    0
1.6    1
0.6 
1.2    1
0.2    0
0.4    0

四、ASCII 码

凡是字符,都要看成一个数字。

Int j=’B’;
Char a=’B’;
Printf(“/b /b”,j,a);
输出:66 66

五、电脑中的加减

65         0100 0001
71         0100 0111
65+71  ->  1000 1000     -120

六、类型转换

char j = 65;
unsingned int a = 0;

j = j + 71;
a = j;
Printf(/d /b”,j,a);
输出:-120 136


65+71   ->  1000 1000  -120(负数)
            1000 1000   136(正数)

(与取值范围有关:char 为正负 125,unsingned int 为 0 到 256)


七、程序

switch(){
case 1: break;
default:           //default可以放在任意位置
}

// 根据优先级调整 case 的顺序,如大部分学生成绩在六七十,则将 case6,case7 调前,可以优化程序。

当 if()里的语句为 1 或其他不为 0 的数时,则执行,若为 0,则不执行。

X>20 也是一个数,逻辑,正确为1,错误为0.
如:

int x = 45,i = 0;
    i = x > 40;
输出i,得 1.
While();
int i=0;
While(i<11)i++;
For(;i<11;i++);

八、位运算

<< >> & | ^

<< >>(左移,右移运算)

char i = 64;    //       0100 0000
i = i << 1;     //左移   1000 0000
输出i;得 -128.

&(与运算)

A  0   0   1
B  0   1   1

C = A & B;

C  0   0   1

(有 0 皆为 0, 双 1 则不变。)

i = 0110 1001;
j = 0011 1100;
i = i & j;
i = 0010 1000;

|(或运算)

同理,|(或逻辑),有 1 则为 1;双 0 则不变。

  1101 1100
  0010 1101
->1111 1101

非运算

非 0 值为 0;0 值为 1;

int i = 101;
i = !i;
输出i,0.

按位取反

i = ~i;
  1001 0010
->0110 1101

^(亦或)

相同为 1,相异为 0;

只设置第五位为1=>  i=i |(1<<5);
      00001001 00001001 00001001 00001001
      00000000 00000000 00000000 00010000
      00001001 00001001 00001001 00011001
      
只设置第五位为0=>  i=i&~(1<<5);
      00001001 00001001 00001001 00011001
      00000000 00000000 00000000 00010000
      11111111 11111111 11111111 11101111
      00001001 00001001 00001001 00001001

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moqim Flourite.

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值