/*语言中进制表示 :
二进制表示 : 在二进制数字前面加上0b;
八进制表示 : 在八进制数字前面加上0;
十六进制表示 : 在十六进制前面加上0x;
进制转换 ;
将其他进制转换成八进制 : 在printf函数中以%o占位;
将其他进制转换成十六进制 : 在printf函数中以%x占位;
在C语言中,没有占位符可将其他进制转换成二进制;
将其他进制转换成十进制 : 在printf函数中以%i或%d占位;
进制转换的原理公式 : 假定m为一个十进制数,转换成nk,nk-1,nk-2,...,n2,n1,n0的l进制数
则 m = n0 + n1 * l^1 + n2 * l^2 + .... + nk-2 * l^(k-2) + nk-1 * l ^(k-1) + nk * l^k
由上可见,当等式左右两端同时除以l时,余项为n0,在整数部分除以l则余项为n1,以此类推,便可以得到m的l进制表达
案例:十进制转换二进制(逆序打印)
#include
void printBin(int num);
int main(int argc, const char * argv[]) {
int num = 4; // 100;
printBin(num);
return 0;
}
void printBin(int num)
{
int zheng = num;
while (zheng != 0)
{
int yu = zheng % 2;
printf("%i",yu);
zheng = zheng / 2;
}
printf("\n");
}
n为二进制的取值范围 : 0~2^n -1
二进制转八进制 : 三位变一位
二进制转十六进制 : 四位变一位
原码 反码 补码
数据内存中均是以补码形式存储,正数的原码,反码,补码全部一样,三码合一
原码 : 最高位为符号位(正数为0,负数为1),其他位则为数字位
反码 : 负数的反码,最高位符号位不变,数字位取反
补码 : 负数的补码,反码加1
位运算符 :
按位与 : & #数字转换成二进制后,对应位,全真则真,由此可见,任何数字和1的按位与还是数字本身 #注 : 可用此法结合移位运算进行进制转换
按位或 : | #数字转换成二进制后,对应位上,一真则真,由此可见,任何数字和0的按位或还是数字本身
按位异或 : ^ #数字转换成二进制后,对应位上,相同则取0,不同则取1.相同的两个数字按位异或结果为0,且按位异或满足交换律 #应用 : 交换两个变量的值
取反 : ^ #取反操作,是直接对存储在内存中的补码进行取反,因此要获得数字本身,还需将其转换成原码之后,再计算
左移 : << #将二进制整体左移n位,缺位补0,相当于原来的数字乘以2^n
右移 : >> #将二进制除了符号位之外整体右移n位,缺位按照符号位的取值进行补齐,相当于原来的数字乘以2^n
#注 : 左移或右移操作均是对补码进行操作
案例一 : 交换变量的值
方法一 :
int num1 = 32;
int num2 = 21;
int temp = num1 + num2;
num1 = temp - num1;
num2 = temp - num1;
方法二 :
int num1 = 32;
int num2 = 21;
int temp = num1 ^ num2;
num1 = temp ^ num1;
num2 = temp ^ num1;
案例二 : 进制转换 :
方法一(正序打印,完全按照其在内存的存储方式进行显示) :
void printBin(int num);
int num = 3;
printBin(num);
void printBin(int num)
{
int delta = 31;
for (int i = delta;i >= 0;i--)
{
int result = (num >> i) & 1;
printf("%i",result);
if (i % 4 == 0)
{
printf(" ");
}
}
printf("\n");
}
方法二(逆序打印) :
void printBin(int num);
int num = 3;
printBin(num);
void printBin(int num)
{
int delta = 0;
for(int i = delta;i < 32;i++)
{
if (i % 4 == 0)
{
printf(" ");
}
int result = (num >> i) & 1;
printf("%i",result);
}
printf("\n");
}
#以上两种方法的缺陷 : 当数字较少,会打印大量无用的0
方法三(改进) :
void printBin(int num);
int num = -4;
printBin(num);
void printBin(int num)
{
int count = 0 ;
while((num >> count) != 0)
{
int result = (num >> count) & 1;
printf("%i",result);
count++;
}
printf("\n");
}
*/
分享文章:C语言之进制转换
分享路径:
http://cxhlcq.com/article/jihsjs.html