一. 我们知道由十进制转二进制的算法,因此可以直接计算出其二进制数
例如:对3求其二进制
int main()
{
int n = 3;
int arr[33] = { 0 };//int 型有32个字节
int i = 0;
while (n > 0)
{
arr[i] = n % 2;
++i;
n /= 2;
}
int k = 0;
for (k = i-1; k >= 0; k--) //逆序输出
{
printf("%d", arr[k]);
}
return 0;
}
二. 因为数字在计算机中就是以二进制的形式存储的,那我们也可以通过 位运算符 来表示出一个数的二进制。
用&(按位与)运算符,其运算原理是对其两个操作数的计算机内存储的二进制形式(补码)的对应位进行按位与,如果1&1结果是1,其他结果都是0。
例如 3&5:
int a = 3;
//a: 00000000000000000000000000000011
int b = 5;
//b: 00000000000000000000000000000101
int c = a & b;
//c: 00000000000000000000000000000001
因此,可以让一个数n&1,然后得到n的二进制的第一位的值(如果结果是1,那n的二进制的第一位也是1,如果是0,那第一位是0),然后让n右移一位n>>1,然后找其第二位。。。。。。然后一直遍历到第32位。
int main()
{
int n = 5;
int i = 0;
int arr[33] = { 0 };//int 是有32位的
//从第一位开始依次取n对应二进制的每一位
for (i = 1; i <=sizeof(int) * 8; i++)
{
arr[i] = n & 1;
n=n >> 1;
}
//printf("%d\n", i);
int k = 0;
//逆序输出
for (k = i-1; k >= 1; k--)
{
printf("%d", arr[k]);
}
printf("\n");
return 0;
}
运算结果:
但是用数组存,有点麻烦,所以我又改进了一下
int main()
{
int n = 5;//0000000101
int i = 0;
int k = 1 << 31;
for (i = 0; i < sizeof(int) * 8; i++)
{
printf("%d", -((n & k) >> 31));
n <<= 1;
}
printf("\n");
return 0;
}
但是我感觉还是有点麻烦,可又想不出更好的方案了。。。。。。
___________________________________________________________
如果您有更好的方法,可以分享给我,我也学习一下。^-^