由一个进制转换程序想到数据在计算机内的存储
2010-11-28 10:41
351 查看
闲来无事,就找了一道程序设计题来练习:编写一个应用程序,读入一个只包含0和1的整数(即二进制整数),然后打印出对等的十进制整数值。要求用求模和除法运算符。于是,我写了如下两个方法:
Code:
public static long readBinaryNum()
{
Scanner scan = new Scanner(System.in);
String binaryNumStr = "";
boolean available = false;
do{
System.out.print("请输入一个二进制整数:");
binaryNumStr = scan.nextLine();
available = Pattern.matches("[0-1]+", binaryNumStr);
if(!available)
{
System.out.println("非二进制数据,此次输入无效!");
continue;
}
if(binaryNumStr.length()>=19)
{
System.out.println("数据太大,此次输入无效!");
available = false;
continue;
}
}while(!available);
return Long.parseLong(binaryNumStr);
}
/**
* 把二进制数值转换为对应的十进制数值
* @param binaryNum 需要转换的二进制数值
* @return 对应的十进制数值
*/
public static long binaryNum2DecimalNum(long binaryNum)
{
System.out.println(binaryNum);
long decimalNum = 0;
int position[] = new int[(int)Math.log10(binaryNum)+1];
position[0] = (int)(binaryNum/Math.pow(10, position.length-1));
for(int i=1;i<position.length;i++)
{
position[i] = (int) (binaryNum % (Math.pow(10, position.length - i))
/ (Math.pow(10, position.length - i - 1)));
}
for(int i=0;i<position.length;i++)
{
decimalNum += position[position.length-i-1] * Math.pow(2, i);
System.out.print(position[i] + " ");
}
System.out.println();
return decimalNum;
}
在测试过程中我发现,如果我输入的数据是11111111111111111(即17个1),则程序转换时就出现问题了,结果是131072(而正确结果应该是131071),于是我又测试。最后发现问题出在求余运算处:
Code:
long n = 11111111111111111L;//17个1
System.out.println(n % Math.pow(10, 1));
System.out.println(n % 10.0);
System.out.println(n % 10);
程序运行,输出结果是:
Code:
2.0
2.0
1
看到这,我想到这个应该和数值在计算机内的存储结构或者除法的运算机制有关,但我不太清楚里面具体是怎么回事!于是写下此文以备忘,也希望各位看官积极讨论、指教!
Code:
public static long readBinaryNum()
{
Scanner scan = new Scanner(System.in);
String binaryNumStr = "";
boolean available = false;
do{
System.out.print("请输入一个二进制整数:");
binaryNumStr = scan.nextLine();
available = Pattern.matches("[0-1]+", binaryNumStr);
if(!available)
{
System.out.println("非二进制数据,此次输入无效!");
continue;
}
if(binaryNumStr.length()>=19)
{
System.out.println("数据太大,此次输入无效!");
available = false;
continue;
}
}while(!available);
return Long.parseLong(binaryNumStr);
}
/**
* 把二进制数值转换为对应的十进制数值
* @param binaryNum 需要转换的二进制数值
* @return 对应的十进制数值
*/
public static long binaryNum2DecimalNum(long binaryNum)
{
System.out.println(binaryNum);
long decimalNum = 0;
int position[] = new int[(int)Math.log10(binaryNum)+1];
position[0] = (int)(binaryNum/Math.pow(10, position.length-1));
for(int i=1;i<position.length;i++)
{
position[i] = (int) (binaryNum % (Math.pow(10, position.length - i))
/ (Math.pow(10, position.length - i - 1)));
}
for(int i=0;i<position.length;i++)
{
decimalNum += position[position.length-i-1] * Math.pow(2, i);
System.out.print(position[i] + " ");
}
System.out.println();
return decimalNum;
}
在测试过程中我发现,如果我输入的数据是11111111111111111(即17个1),则程序转换时就出现问题了,结果是131072(而正确结果应该是131071),于是我又测试。最后发现问题出在求余运算处:
Code:
long n = 11111111111111111L;//17个1
System.out.println(n % Math.pow(10, 1));
System.out.println(n % 10.0);
System.out.println(n % 10);
程序运行,输出结果是:
Code:
2.0
2.0
1
看到这,我想到这个应该和数值在计算机内的存储结构或者除法的运算机制有关,但我不太清楚里面具体是怎么回事!于是写下此文以备忘,也希望各位看官积极讨论、指教!
相关文章推荐
- 一个简单程序思考计算机里int数据的存储问题,兼论大端模式和小端模式
- 计算机程序数据存储&nbsp;堆&nbsp;栈
- 问:当前计算机系统一般会采用层次结构存储数据,请介绍下典型计算机存储系统一般分为哪几个层次,为什么采用分层存储数据能有效提高程序的执行效率?
- c++十进制int型整数转换成计算机中存储的任意进制
- 简化以下程序,将函数对象 divide_by 转换为一个函数,并将 for 循环替换为用一个标准的 C++ 算法来输出数据
- 【计算机基础】程序数据的5种存储位置(堆与栈)
- 数据的存储与进制转换
- 8、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数, 然后打印出这个十进制整数对应的二进制形式。
- 编写一个程序,用valueOf()方法将long型数据12345678转换为字符串。再用toString()方法将十进制int型数据100转换为十六进制数表示的字符串。
- 尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。
- 【计算机基础】程序数据的5种存储位置(堆与栈) (转载)
- 将一个十进制数据转换为M进制
- 编写程序读入一组string类型的数据,并将它们存储在vector中,再将vector对象复制给一个字符指针数组。
- 3.4 编写一个程序,将用户输入的数字(0~6)转换成相应的星期值输出。如用户输 入 3,则程序输出“Today is Wed”;用户输入 0,则输出“Today is Sun”。如果用户输入 的数据
- 8.编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数
- 用Python写了一个数据格式转换小程序
- 一个关于继承的程序,求高人解释程序执行过程中内存的数据存储情况
- 编写一个程序,用parseInt()方法将字符串100由十六进制转换为十进制的int型数据。再用valueOf()方法将字符串12345678转换为long型数据。
- 计算机为什么用二进制存储数据?即为什么是0101010,为什么不用其他进制?既然计算机是二进制,为什么又衍生出来一八进制、十六进制干什么,八进制和十六进制在计算机中有什么用呢?
- 3.7 编写一个程序,以字符形式输入某进制的数字,将其转换为十进制数值并显示出