整数转换二进制, 高效使用位运算
将十进制数整数转换二进制的方法很多,但是很少有看到使用位运算的方法,我现在分享的方法便是利用C语言能够 对位运算操作高效的特点。对于C语言来说,一个整数在内存里面就是以二进制的形式存储的,所以没有必要再将其经过一系列运算转换成二进制的形式,只要将整数在内存中的二进制表示输出即可。
- 递归调用方法:
// 这里使用无符号数作为形参,是为了避免有符号数右移时补符号位
void recursion(unsigned int num)
{
if (num > 0) { // 判断是否大于0
recursion(num >> 1); // 递归调用,寻找不为0的最高位
printf("%u", num & 1); // 找到最高位后才开始输出
}
}
- 循环方法
void circulation(unsigned int num)
{
unsigned int nFlag = 0; // 用来标记不为0的最高位
unsigned int nEachBit = 0; // 记录每一位的二进制
// 0x80 00 00 00 = 1000 0000 0000 0000 0000 0000 0000 0000
for (unsigned int index = 0x80000000; index > 0; index >>= 1) {
nEachBit = ((num & index) != 0); // index从最左边的位开始和num与运算,记录其是否为1
if (nEachBit) {
nFlag = 1; // 第一次不为0之后,nFlag会一直是1
}
if (nFlag) {
printf("%u", nEachBit); // 从第一个不为0的位开始,每一位都输出;
}
}
}
- 主函数
int main(void)
{
while (1) {
printf("请输入一个数:");
int num = 0;
scanf("%d", &num);
printf("它的二进制位:");
if (0 == num) { // 避免了整数为0时,没有任何输出的情况
printf("%d", 0);
} else {
recursion(num);
//circulation(num);
}
printf("\n");
}
return 0;
}
经测试,此函数可以正常输出 -2147483648 ~ 4294967295 ( 即 -(231) ~ ( 232 - 1 ) )之间的整数,递归方法精炼,也是训练程序员思维的好方式,极力推崇。