您的位置:首页 > 职场人生

黑马程序员—C学习笔记—左移和右移实现二进制转换(以及BUG解决心得)

2015-03-25 11:08 417 查看
———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————

自己敲得一些代码,来更好地了解左移右移运算,并且将10进制整数转换为2进制输入。代码如下,关于里面的变化,相信小伙伴们能够从注释里面看到。


#include <stdio.h>

int main()
{
void IntToBinary();
void IntToBinary2();

int inputNumber = 0;

//    do
//    {
//        printf("请您输入需要转换为二进制的数,退出请输入0:\n");
//        scanf("%d",&inputNumber);
//        IntToBinary(inputNumber);
//        IntToBinary2(inputNumber);
//    }while (inputNumber!=0);

//上述写法,退出时,依然转换0

//    printf("请您输入需要转换为二进制的数,退出请输入0:\n");
//    scanf("%d",&inputNumber);
//
//    while(inputNumber!=0)
//    {
//        IntToBinary(inputNumber);
//        IntToBinary2(inputNumber);
//    }
//上述写法,死循环

do
{
printf("请您输入需要转换为二进制的数,退出请输入0:\n");
scanf("%d",&inputNumber);
if(inputNumber==0){break;}  //这一行必不可少,否则只能用goto语句了
IntToBinary(inputNumber);
IntToBinary2(inputNumber);
printf("\n");
}while (inputNumber!=0);

return 0;
}

//下面是两种IntToBinary();函数去实现10进制数目转换为2进制输入的情况。

//利用右移动

void IntToBinary(int num)  //此方法的思路是不断向右移动目标数来获得目标数在某一位上面的0或者1。
{
//不同编译器,int长度可能有所不同,首先是获得int长度
int intLength = sizeof(int);//字节数,转换为位数,还需要乘以8
printf("你输入的十进制数字%d转换为二进制如下:\n",num);

for(int i = (intLength<<3)-1;i >= 0;i--)//确定i的范围边界时,需要特别注意开始和收尾的数据,i最小可以为0,而不是1。
{
printf("%d",(num>>i)&1);
if(i%4==0)
{
printf(" ");
}
}

printf("\n");

}

void IntToBinary2(int num)  //此方法是不移动目标数,而是移动临时数据,也可以获取目标数某一位上得值。
{
//不同编译器,int长度可能有所不同,首先是获得int长度
int intLength = sizeof(int);//字节数,转换为位数,还需要乘以8
printf("你输入的十进制数字%d转换为二进制第二种方法如下:\n",num);

//    for(int i = (intLength<<3)-1;i >= 0;i--)
//    {
//        printf("%d",(num&(1<<i))>0?1:0);
//        if(i%4==0)
//        {
//            printf(" ");
//        };
//    };

printf("%d",(num>0?0:1));//判断数字正负性,提前打出第一个字符,确保后续左移操作不越出边界

for(int i = (intLength<<3)-2;i >= 0;i--)
{
printf("%d",(num&(1<<i))>0?1:0);
if(i%4==0)
{
printf(" ");
};
};

printf("\n1<<30=%d",1<<30);
printf("\n1<<31=%d",1<<31);
printf("\n1>>1=%d",1>>1);
printf("\n1>>2=%d",1>>2);

printf("\n");

}


程序运行结果如下:



综合以上代码和注释可以看出,左移右移运算是有边界的,一旦逾越可能会得到未知的结果,所以sizeof是很有必要使用来动态获取当前环境变量所占字符数,然后,右移操作注意移到最后一位,左移还得多考虑一个符号位的问题,建议测试的时候使用负数测试一下,不然可能忽略到这个小问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐