黑马程序员—C学习笔记—左移和右移实现二进制转换(以及BUG解决心得)
2015-03-25 11:08
417 查看
———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————
程序运行结果如下:
综合以上代码和注释可以看出,左移右移运算是有边界的,一旦逾越可能会得到未知的结果,所以sizeof是很有必要使用来动态获取当前环境变量所占字符数,然后,右移操作注意移到最后一位,左移还得多考虑一个符号位的问题,建议测试的时候使用负数测试一下,不然可能忽略到这个小问题。
自己敲得一些代码,来更好地了解左移右移运算,并且将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是很有必要使用来动态获取当前环境变量所占字符数,然后,右移操作注意移到最后一位,左移还得多考虑一个符号位的问题,建议测试的时候使用负数测试一下,不然可能忽略到这个小问题。
相关文章推荐
- 黑马程序员之C#学习笔记:枚举以及将字符串转换为枚举学习心得
- 黑马程序员—C学习笔记—字符串匹配和scanf函数bug解决
- 黑马程序员_学习笔记4 IO流以及正则表达式解决一个传智播客的问题
- 设计模式学习笔记以及java代码实现
- 黑马程序员_学习笔记5多线程在的应用遇到的主要问题及解决方法。
- 黑马程序员之asp.net学习笔记:巧用C#做中间语言 实现java调用.net
- 黑马程序员之 C#学习笔记:飞行棋地图二维数组实现方法
- 学习 JpGraph心得以及一些常见问题解决
- 黑马程序员之C#编程基础学习笔记:用while continue实现计算1到100之间的除了能被7整除之外所有整数的和。
- 黑马程序员之ORACLE数据库学习笔记:如何实现连接池及连接池的优缺点
- 黑马程序员之HTML学习笔记:rowspan属性实现HTML表格中一列跨越多行,colspan 属性实现HTML表格中一行跨越多列
- 算法导论学习笔记(1)——快排中hoarePartition的实现(问题已解决)
- 黑马程序员_学习笔记2交通灯系统中面向对象思想的理解以及工厂模式的应用
- 黑马程序员学习笔记4---SQL SERVER 2000/2005 实现行转列和列转行
- 黑马程序员之c#学习笔记:C#中的方法的种类以及区别
- C/C++中strlen(),strcpy(),strcat()以及strcmp()的代码实现--学习笔记
- 黑马程序员_学习笔记15_asp.net之验证码实现原理初探
- 黑马程序员_学习笔记22_HttpHanlder实现文件下载
- 黑马程序员之javascript学习笔记:用javascript实现一个简易计算器
- 黑马程序员之ASP.NET学习笔记:AJAX解决什么问题?如何使用AJAX?