在嵌入式面试中可能会遇到一道进制转换的题目,因为嵌入式很多操作都涉及到位运算,而且对二进制的使用频率也是特别高的,所以我们理应将一些进制转换的实现和位运算弄清楚。
文章目录
1. 判断一个数是否为2的次方
1.1 步骤和解释:
首先我们需要知道的是2的幂次方在二进制中都是只有一个1的:
2--------10
4--------100
8--------1000
16-------10000
32-------100000
-----------------
所以现在我们可以判断,如果二进制中只有一个1,其他位都是0,则这个数就是2的幂次方;
接着,我们使用这个数-1进行与计算,因为这个数如果是2的幂次方的话,n-1就是高位往下一位后所有位都是1,例如:
2------------10
2-1----------01
4------------100
4-1----------011
8------------1000
8-1----------0111
16-----------10000
16-1---------01111
然后我们使用与(&)进行按位与逻辑运算,使用按位与操作的时候,编译器会自动将十进制的数值转化成二进制,所以我们并不需要手动转化:
2------------10
2-1----------01 10&01=0
4------------100
4-1----------011 100&011=0
8------------1000
8-1----------0111 1000&0111=0
16-----------10000
16-1---------01111 10000&01111=0
可见,如果数值是2的次方,则其n&(n-1)=0
,我们可以使用一个不是2的次方进行反证,如果这个数值为15时:
1.2 示例程序:
所以根据这个特性,可以编写程序进行验证:
#include <stdio.h>
int isPowerOfTwo(int num) {
if (num <= 0) {
return 0; // 如果是小于等于0的数,直接返回false
}
return (num & (num - 1)) == 0;
}
int main() {
int number;
printf("Enter a number: ");
scanf("%d", &number);
if (isPowerOfTwo(number)) {
printf("%d is a power of 2.", number);
} else {
printf("%d is not a power of 2.", number);
}
return 0;
}
1.3 代码解释:
在这个例子中,isPowerOfTwo函数接受一个整数作为参数,使用位运算判断该数是否是2的幂次方。具体的判断条件是(num & (num - 1)) == 0
,这个条件表示num的二进制表示中只有一位是1,其他位都是0。
在main函数中,我们通过用户输入一个数,并调用isPowerOfTwo函数来判断该数是否是2的幂次方,然后输出相应的结果。
如果输入的数是2的幂次方,比如输入1、2、4、8等,输出结果会显示该数是2的幂次方;否则输出结果会显示该数不是2的幂次方。
虽然上面的代码示例中并不涉及十进制转化成二进制的问题,但是可以介绍一下十进制转化成二进制的方法:
2. 十进制转化成二进制
我们可以使用位运算的方式将一个十进制数转换成二进制数
2.1 示例程序:
#include <stdio.h>
void decimalToBinary(int num) {
if (num == 0) {
printf("0");
return;
}
int binary[32]; // 用于存放二进制数的每一位
int i = 0;
while (num > 0) {
binary[i] = num % 2; // 取余得到二进制数的每一位
num = num / 2; // 更新num为除以2后的商
i++;
}
// 倒序输出二进制数的每一位
for (int j = i - 1; j >= 0; j--) {
printf("%d", binary[j]);
}
}
int main() {
int number;
printf("Enter a decimal number: ");
scanf("%d", &number);
printf("Binary representation: ");
decimalToBinary(number);
return 0;
}
2.2 代码解释:
在上述代码中,decimalToBinary
函数用于将十进制数转换为二进制数。它通过不断地取余和整除2来获取二进制数的每一位,并将其存储在一个数组中。然后,通过倒序输出数组中的元素,即可得到该十进制数的二进制表示。
在main
函数中,我们从用户输入获取一个十进制数,并调用decimalToBinary
函数来进行转换并打印结果。
以输入的十进制数为例,输出结果将显示该数的二进制表示。例如,输入十进制数10,输出结果为二进制数1010。
3. 十进制转化成二进制
3.1 示例程序:
#include <stdio.h>
#include <math.h>
int binaryToDecimal(long long binarynum) {
int decimalnum = 0, temp = 0, remainder;
while (binarynum != 0) {
remainder = binarynum % 10;
binarynum /= 10;
decimalnum += remainder * pow(2, temp);
++temp;
}
return decimalnum;
}
int main() {
long long binarynum;
printf("Enter a binary number: ");
scanf("%lld", &binarynum);
printf("Decimal number: %d", binaryToDecimal(binarynum));
return 0;
}
3.2 代码解释:
这段代码首先定义了一个名为binaryToDecimal
的函数,该函数接受一个长整型的二进制数作为参数,并返回对应的十进制数。函数内部使用循环来遍历二进制数的每一位,通过取余和除法运算来逐步计算出对应的十进制数。最后,pow
函数用于计算2的幂次方,即将二进制位转换为对应的权重。
在main
函数中,我们首先要求用户输入一个二进制数,然后调用binaryToDecimal
函数来计算对应的十进制数,并将结果打印到屏幕上。