第1章 基础知识
第1节 二进制
1. 二进制
1697年,德国数理哲学大师莱布尼兹发现二进制。基数为2,逢2进位的计数方法,0、1是它的基本数字符号。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现,在电脑上普遍采用。除二进制(B)外,在电脑上常用的还有八进制(O)、十进制(D)和十六进制(H)等。
2.二进制转换为十进制
各位二进制数与其对应权值的乘积之和即为与该二进制相对应的十进制。
例: 110011.101B
=25+24+21+20+2-1+2-3
=51.625D
3.十进制转换为二进制
降幂法:首先写出要转换的十进制数,其次写出所有小于此数的各位二进制权值,然后用要转换的十进制数减去与它最接近的二进制权值,如够减则减去并在相应位记以1;如不够减则在相应位记以0并跳过此位;如此不断重复,直到该数为0为止。
例:将十进制数117转换为二进制数计算过程如下:
小于117的二进制权为64 32 16 8 4 2 1
所以117的二进制为1110101。
除法:把要转换的十进制数的整数部分不断除以2,并记下余数,直到商为0为止。
例:将十进制数117转换为二进制数计算过程如下:
所以117的二进制为1110101。
计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
第2节 位
位,英文名称是Bit,亦称二进制数位,指二进制中的一位,是计算机存储的最小单位。Bit是Binary digit(二进制数位)的缩写,由数学家John Wilder Tukey提出(可能是1946年提出,但有资料称1943年就提出了)。这个术语第一次被正式使用,是在香农著名的论文《通信的数学理论》(A Mathematical Theory of Communication)第1页中。
不同进位制下一位的信息量并不总是一个二进位,例如八进制的7转换成二进制后就成了111。(7=2*2+2+1=10*10+10+1=100+10+1=111)
第3节 字节
字节,英文名称是Byte。一个字节代表八个位。通常用作计算机信息计量单位,与具体的数据类型无关。现代计算机中连续的、固定数量的比特(二进制)。
八个二进制数位经常在规范中被称为Octet(八位组),例如在一些工业标准、网络及电信技术里。Byte(字节)可被缩写成B,例如MB表示Megabyte;Bit(位元)可被缩写成b,例如Mb表示Megabit。法语国家有时把“o”用于“octet”。很多人不接受,因为这在国际单位制中有与零混淆的风险。
到目前为止字节制单位及换算:
1字节(Byte)=8比特(bit)=8位
1KB=1024B byte字节
1MB=1024KB Kilobyte千字节
1GB=1024MB Megabyte兆字节
1TB=1024GB Gigabyte吉字节
1PB=1024TB Terabyte太字节
1EB=1024PB Petabyte拍字节
1ZB=1024EB Exabyte艾字节
1YB=1024ZB Zettabyte泽字节
1BB=1024YB YottaByte尧字节
1NB=1024BB Brontobyte
1DB = 1024NB NonaByte
1CB = 1024DB DoggaByte
1XB = 1024CB
C语言各数据类型占用内存的大小(与编译器有关)
#include <stdio.h>
int main(int argc, char * argv[]) {
printf("sizeof(char) =%dbyte.\n", sizeof(char));
printf("sizeof(short) =%dbytes.\n", sizeof(short));
printf("sizeof(int) =%dbytes.\n", sizeof(int));
printf("sizeof(long) =%dbytes.\n", sizeof(long));
printf("sizeof(float) =%dbytes.\n", sizeof(float));
printf("sizeof(double)=%dbytes.\n", sizeof(double));
return 0;
}
sizeof(char) =1byte.
sizeof(short) =2bytes.
sizeof(int) =4bytes.
sizeof(long) =4bytes.
sizeof(float) =4bytes.
sizeof(double)=8bytes.
第4节 十六进制
十六进制(简写为hex或下标16)是一种基数为16,逢16进1的计数方法,一般用数字0到9和字母A到F表示(其中:A~F即10~15)。例如十进制数57,在二进制写作111001,在16进制写作39。在历史上,中国曾经在重量单位上使用过16进制,比如,规定16两为一斤。
有些时候用二进制表示数不太方便(代码很长),所以经常采用十六进制表示法, 4位二进制数可用1位十六进制数来表示。因为将4个位(Bit)很容易转化成单独的16进制数字, 16进制普遍应用在计算机领域。1字节可以表示成2个连续的16进制数字。可是,这种混合表示法容易令人混淆,因此需要一些字首(0x)、字尾(H)或下标(16)来显示。
1.二进制数和十六进制数之间的转换
由于十六进制数的基数是2的幂,所以这两种数制之间的转换十分容易。
例: 0011 0101 1011 1111
3 5 B F
即 0011010110111111B = 35BFH
例: A 1 9 C
1010 0001 1001 1100
即 A19CH = 1010000110011100B
2.十六进制数转换为十进制数
各位十六进制数与其对应权值的乘积之和即为与该十六进制数相对应的十进制数。
例:8AB4H
=8×163+10×162+11×161+4×160
=32768+2560+176+4
=35508D
3.十进制数转换为十六进制数
转换方法与十进制转换为二进制的方法类似。
降幂法:首先写出要转换的十进制数,其次写出小于该数的十六进制权值,然后找出该数中包含多少个最接近它的权值的倍数,这一倍数即对应位的值,用原数减去此倍数与相应位权值的乘积得到一个差值,再用此差值去找低一位的权值的倍数,如此反复直到差值为0为止。
例:将十进制数48956转换为十六进制数计算过程如下:
小于48956的十六进制权值为 4096 256 16 1
所以48956的十六进制为BF3CH。
除法:把要转换的十进制数的整数部分不断除以16,并记下余数,直到商为0为止。
例:将十进制数48956转换为十六进制数计算过程如下:
48956 / 16 = 3059 12 C
3059 / 16 = 191 3 3
191 / 16 = 11 15 F
11/ 16 = 0 11 B
所以48956的十六进制为BF3CH。
十进制转换为十六进制
#include <stdio.h>
int main(int argc, char * argv) {
char ch;
ch = 11;
printf("11=%X\n", ch);
return 0;
}
11=B
第5节 二进制数和十六进制数的运算
包括算术运算和逻辑运算。
1.算术运算
二进制数的运算:
加法规则: 乘法规则:
0 + 0 = 0 0 0 = 0
0 + 1 = 1 0 1 = 0
1 + 0 = 1 1 0 = 0
1 + 1 = 0(进位1) 1 1 = 1
十六进制数的运算:十六进制的加、减、乘、除与十进制类似。
2.逻辑运算
所有的逻辑运算都是按位操作的。
“与”运算(AND)
“或”运算(OR)
“非”运算(NOT)
“异或”运算(XOR)
例:X=00FFH,Y=5555H,Z1=XY,Z2=XY,Z3=,Z4=XY,求Z1、Z2、Z3、Z4的值。
解:X = 0000 0000 1111 1111
Y = 0101 0101 0101 0101
Z1= 0000 0000 0101 0101 = 0055H
Z2= 0101 0101 1111 1111 = 55FFH
Z3= 1111 1111 0000 0000 = FF00H
Z4= 0101 0101 1010 1010 = 55AAH
2015/12/18 追加
十进制小数的二进制,八进制,十六进制转换方法
http://my.oschina.net/dubenju/blog/535161
来源:oschina
链接:https://my.oschina.net/u/660460/blog/500830