实现思想:
二进制数是以bit为操作数,所以要想将一个数转换为二进制数,我们需要先要将输入的数字转化为二进制数,然后从高位到低位判断每一位是 1 还是 0,最后把对应的 1 和 0 打印出来。
其中所要运用到位运算的相关知识。
位运算:
位运算是针对二进制而言的,位指的是bit位,但凡涉及位运算,
不管几进制的数据计算机中都会转换成二进制参与运算。
一般情况下涉及位运算使用的都是 无符号 数
如果是有符号数 可能需要考虑 原码、反码、补码转换的问题
位运算一般多用于硬件设备的控制或者标志位的控制。
& 按位与 按位运算 全1为1 有0为0
| 按位或 按位运算 有1为1 全0为0
^ 按位异或 按位运算 不同为1 相同为0
~ 按位取反 按位运算 0变1 1变0
>> 按位右移 整个数据向右移动 高位补0 舍弃低位
<< 按位左移 整个数据向左移动 低位补0 舍弃高位
例如:
#include <stdio.h>
int main(int argc, const char *argv[])
{
unsigned char a = 0xa5;
unsigned char b = 0x97;
unsigned char c = 0;
//按位与
c = a & b;
//a: 10100101
//b: 10010111
// &
//c: 10000101 -->0x85
printf("a & b = %#x\n", c);//0x85
//按位或
c = a | b;
//a: 10100101
//b: 10010111
// |
//c: 10110111 -->0xB7
printf("a | b = %#x\n", c);//0xB7
//按位异或
c = a ^ b;
//a: 10100101
//b: 10010111
// ^
//c: 00110010 -->0x32
printf("a ^ b = %#x\n", c);//0x32
//按位取反
c = ~a;
//a: 10100101
// ~
//c: 01011010 -->0x5A
printf("~a = %#x\n", c);//0x5A
//按位左移
c = a<<2;
//a: 10100101
// <<2
//c: 10010100 -->0x94
printf("a<<2 = %#x\n", c);//0x94
//按位右移
c = a>>2;
//a: 10100101
// >>2
//c: 00101001 -->0x29
printf("a>>2 = %#x\n", c);//0x29
return 0;
}
程序代码:
#include <stdio.h>
void binary(int number); //声明binary函数
int main(int argc, const char *argv[])
{
int number = 0;
scanf("%d",&number);
binary(number);
return 0;
}
void binary(int number){
unsigned turn = 1u<<31;
//1u表示这是一个unsigned的1
//通过<<31得到最高位为1的数字,0x1000...
int out = number & turn?1:0;
for(; turn ; turn >>=1){
//通过以turn的长度为次数,将turn向右逐一移位
out = number & turn?1:0;
//通过&运算判断number的每一位是否为1
printf("%d",out);
//如果为number的某一位为1,则在该位置输出一个1,反之输出一个0
}
printf("\n");
}
运行结果:
注意:
函数中定义的参数为turn参数为无符号的int类型,大小为32bit,所以输出的二进制数的范围是0 ~ 2^32-1。最小输出32个 0 最大输出32个 1 。