一、信息的存储
1.进制转换
在计算机中我们常需要装换的进制有二进制,十进制,八进制,十六进制。
其中,二进制,八进制,十六进制之间的转换都是非常简单的,直接参照下面的表进行按位替换就行了。要注意的是,八进制与二进制转换是一个八进制位等价三个二进制位,十六进制与二进制转换是一个十六进制等价四个二进制位。
二进制 | 八进制 | 十六进制 |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | |
1001 | 9 | |
1010 | A | |
1011 | B | |
1100 | C | |
1101 | D | |
1110 | E | |
1111 | F |
至于十进制与其他进制之间的转换,也是完全套用规律,用十进制与二进制之间的转换举例即可。
1.十进制装换为二进制:
void dec_to_bin( int dec )
{
assert( dec >= 0 );
//保存每次除完之后的余数
int remain = 0;
if ( dec == 0 )
return ;
remain = dec % 2;
dec = dec / 2;
//递归求解
dec_to_int( dec );
printf( "%d", remain );
}
2.二进制转换为十进制:
void bin_to_dec( unsigned long bin )
{
assert( bin >= 0 );
int result = 0;
int i = 0;
//权重
int weight = 1;
while ( bin )
{
result += (bin%10) * weight;
bin /= 10;
//模拟2的n次方
weight *= 2;
}
printf( "%d\n", result );
}
2.大端存储和小端存储
关于大端小端,用一幅图就可以说清楚。
图表现的是字0x01234567分别在大小端机器内的存储结构, 其中高位字节的十六进制值为0x01,而低位字节值为0x67.
大端是字的高位存储在地址的底位,字的低位存储在地址的高位。
小端是字的高位存储在地址的高位,字的低位存储的地址的低位。
linux一般为小端机,Windows的pc版本一般为大端机。
3.C语言中的位级运算
C语言的位级运算有 |(按位或),&(按位与),~(取反),^(异或),这些不用多说,值得说的一点就是可以利用异或实现不借助临时变量来交换两个变量的值,代码如下:
void inplace_swap(int *x, int *y)
{
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
另外,这里再给出几种不借助临时变量来交换两个变量的值得其他方法:
void inplace_swap(int *x, int *y)
{
*x = *y - *x; //算出x和y之间的差值
*y = *y - *x; //用y减去y和x之间的差值,得到的就是x的值
*x = *y + *x; //用x加上y和x之间的差值,得到的就是y的值
}
还可以用栈实现这个功能,实现方法比较简单,就不在贴代码了。
4.C语言中的移位运算
移位运算主要分为向左移动和向右移动,向左移动比较简单,都是采用的逻辑移位,而向右移动就要分情况处理,如果被移位的数是无符号的右移采用逻辑移位,如果是有符号的右移,大多都采用算术移位。