目录
简介
二进制(binary)在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)。
一个8Bit位的二进制数据如下:
11111111
其本质表示是 2的8次方共256种可能,因为每一个Bit位都有两种可能 0 或者 1;
反应到十进制的数量上就表示 0-255 共256个数。
进制换算
其实不管几进制最终的本质都是表示的可能数。
以5Bit位的二进制数据为例:
11111
转为八进制:
因为每3个二进制位的可能数正好是8,所以每3个二进制位就构成了1个八进制位
11111前面补0后变为 011 111
其中011 构成八进制的十位 3
其中111 构成八进制的个位 7
所以转换位八进制是 37
转为十进制:
11111所能表示的可能数是:2的4次方 + 2的3次方 + 2的2次方 + 2的1次方 + 2的0次方 = 31
另外一种算法:2^5-1 = 31
所以转为十进制是 31
转为十六进制:
十六进制与八进制类似,只不过是4个二进制位构成1个十六进制位
11111前面补0后变为 0001 1111
其中0001 构成十六进制的十位 1
其中1111 构成十六进制的个位 f
所以转换位十六进制是 1f
十进制转二进制
整数部分采用 “除2取余,逆序排列”法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来 例:125
小数部分要使用“乘 2 取整法”。即用十进制的小数乘以 2 并取走结果的整数(必是 0 或 1),然后再用剩下的小数重复刚才的步骤,直到剩余的小数为 0 时停止,最后将每次得到的整数部分按先后顺序从左到右排列即得到所对应二进制小数。例如,将十进制小数 0.8125 转换成二进制小数过程如下
位运算
iOS中的二进制
一、首先来了解一个c/c++中的类型 char 类型
char用于C或C++中定义字符型变量,只占一个字节,取值范围为 -128 ~ +127(-2^7~2^7-1)。C语言中如int、long、short等不指定signed或unsigned时都默认为signed,但char在标准中不指定为signed或unsigned,编译器可以编译为带符号的,也可以编译为不带符号的。
(1)定义:char型数据是计算机编程语言中只可容纳单个字符的一种基本数据类型。
(2)取值范围:
signed char: -2^7 ~ 2^7-1
unsigned char : 0 ~ 2^8-1
因为char类型的数据只占用一个字节1Byte,即8个Bit位:1111 1111
1、unsigned 即最高位不表示符号位
那么8个Bit位表示的可能是256种,即0~255,所以 unsigned char 的取值范围是 0 ~ 2^8-1。
2、signed 即最高位表示符号位 0 表示正数 1 表示负数
因为计算机使用补码:
0 0000000 ~ 0 1111111 表示的范围是 +0 ~ +2^7-1 补码表示形式是 0 0000000 ~ 0 1111111;
1 0000000 ~ 1 1111111 表示的范围是 -0 ~ -2^7-1 补码表示形式是 1 0000001 ~ 1 1111111 和 1 0000000;
其中规定补码1000 0000 表示 -128. 所以signed char 的取值范围是 -2^7 ~ 2^7-1
3、如何判断编译器对char类型的处理
char c=-1;
if(c<200){
printf("signed\n");
}else{
printf("unsigned\n");
}
二、UInt8类型
先看下UInt8类型的定义:
typedef unsigned char UInt8;
所以Uint8类型的变量,占用8个Bit位即1Byte,且无符号,取值范围为 0 ~ 255.
三、Byte类型
从字面意思来理解 字节类型, 字节是内存的最小计量单元,1Byte = 8Bit。所以Byte类型的变量应该占用8个Bit位,取值范围是 0 ~ 255.下面看下Byte类型的定义:
typedef UInt8 Byte;
四、NSData类型
NSData 是 Object-C中的一种数据类型,官方文档给出的解释是:A static byte buffer in memory
const Byte bytes[] = {0x61,0x62,0x63};
NSData * data = [NSData dataWithBytes:bytes length:sizeof(bytes)/sizeof(Byte)];
NSLog(@"data=%@",data);//data=<616263>
从其中的一个类方法中也可以看出,它是一个buffer容器,放置的类型是 Byte类型。从打印结果也可以印证。
五、总结
从上可以总结出以下写法从本质上是相同的,但需要注意的是1个字节的表示范围 0~255.
const Byte bytes[] = {'a','b','c'};
const UInt8 bytes1[] = {0x61,0x62,0x63};
const unsigned char bytes2 = {97,98,99};
NSData * data = [NSData dataWithBytes:bytes length:sizeof(bytes)/sizeof(Byte)];
行者常至,为者常成!