十進制數(shù)轉(zhuǎn)二進制數(shù)的算法如下:
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的礦區(qū)網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1. 十進制整數(shù)轉(zhuǎn)換為二進制整數(shù)
十進制整數(shù)轉(zhuǎn)換為二進制整數(shù)采用"除2取余,逆序排列"法。具體做法是:用2去除十進制整數(shù),可以得到一個商和余數(shù);再用2去除商,又會得到一個商和余
數(shù),如此進行,直到商為零時為止,然后把先得到的余數(shù)作為二進制數(shù)的低位有效位,后得到的余數(shù)作為二進制數(shù)的高位有效位,依次排列起來。
2.十進制小數(shù)轉(zhuǎn)換為二進制小數(shù)
十進制小數(shù)轉(zhuǎn)換成二進制小數(shù)采用"乘2取整,順序排列"法。具體做法是:用2乘十進制小數(shù),可以得到積,將積的整數(shù)部分取出,再用2乘余下的小數(shù)部分,又
得到一個積,再將積的整數(shù)部分取出,如此進行,直到積中的小數(shù)部分為零,或者達到所要求的精度為止。然后把取出的整數(shù)部分按順序排列起來,先取的整數(shù)作為
二進制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。
下面就給出根據(jù)十進制數(shù)轉(zhuǎn)二進制數(shù)的算法所寫的一段Java程序以供大家參考:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
Test t = new Test();
double d = 8;
String s = t.decimal2BinaryStr(d);
System.out.println("十進制數(shù)"+d+"轉(zhuǎn)成二進制數(shù)為:"+s);
}
/**
* 十進制數(shù)轉(zhuǎn)二進制數(shù)
* @param d 十進制數(shù)
* @return 十進制數(shù)轉(zhuǎn)換成二進制的字符串
*/
public String decimal2BinaryStr(double d){
String result = decimal2BinaryStr_Inte(d);
result += decimal2BinaryStr_Deci(d);
return result;
}
/**
* 十進制整數(shù)部分轉(zhuǎn)二進制數(shù)
* @param d 十進制數(shù)
* @return 十進制整數(shù)部分轉(zhuǎn)換成二進制的字符串
*/
public String decimal2BinaryStr_Inte(double d){
// return Integer.toBinaryString((int)d);
/*
* 本來利用上面的Integer.toBinaryString(int)就可以得到整數(shù)部分的二進制結(jié)果,
* 但為了展示十進制轉(zhuǎn)二進制的算法,現(xiàn)選擇以下程序來進行轉(zhuǎn)換
*/
String result = "";
long inte = (long)d;
int index = 0;
while(true){
result += inte%2;
inte = inte/2;
index++;
if(index%4 == 0){
result+=" ";
}
if(inte==0){
while(index%4!=0){
result+="0";
index++;
}
break;
}
}
char[] c = result.toCharArray();
char[] cc = new char[c.length];
for(int i=c.length; i0; i--){
cc[cc.length-i] = c[i-1];
}
return new String(cc);
}
/**
* 十進制小數(shù)部分轉(zhuǎn)二進制
* @param d 十進制數(shù)
* @return 十進制小數(shù)部分轉(zhuǎn)換成二進制小數(shù)的字符串
*/
public String decimal2BinaryStr_Deci(double d){
return decimal2BinaryStr_Deci(d, 0);
}
/**
* 十進制小數(shù)部分轉(zhuǎn)二進制
* @param d 十進制數(shù)
* @param scale 小數(shù)部分精確的位數(shù)
* @return 十進制小數(shù)部分轉(zhuǎn)換成二進制小數(shù)的字符串
*/
public String decimal2BinaryStr_Deci(double d, int scale){
double deci = sub(d,(long)d);
if(deci==0){
return "";
}
//為了防止程序因所轉(zhuǎn)換的數(shù)據(jù)轉(zhuǎn)換后的結(jié)果是一個無限循環(huán)的二進制小數(shù),因此給其一個默認的精確度
if(scale==0){
scale = (String.valueOf(deci).length()-2)*4;
}
int index = 0;
StringBuilder inteStr = new StringBuilder();
double tempD = 0.d;
while(true){
if(deci==0 || index==scale){
while(index%4!=0){
inteStr.append("0");
index++;
}
break;
}
if(index==0){
inteStr.append(".");
}
tempD = deci*2;
inteStr.append((int)tempD);
deci = sub(tempD ,(int)tempD);
index++;
if(index%4 == 0){
inteStr.append(" ");
}
}
return inteStr.toString();
}
/**
* 提供精確的減法運算。
* @param v1 被減數(shù)
* @param v2 減數(shù)
* @return 兩個參數(shù)的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
}
例如將十進制數(shù)1234.5轉(zhuǎn)成二進制數(shù)為:0100 1101 0010.1000
兩個數(shù)相加,會得到一個結(jié)果,和一個進位的結(jié)果,
然后將這個進位的結(jié)果后面加0補位,然后再和這個結(jié)果相加。如此遞歸,知道進位全部是0為
public class $ {
public static void main(String[] args) {
String s0 = "100";// 十進制4
StringBuffer result = new StringBuffer();
StringBuffer jinwei = new StringBuffer();
System.out.println(test(result, jinwei, ));
}
private static String test(StringBuffer result, StringBuffer jinwei, String s0, String {
// 沒有進位了就退出
if (s0.length() 0 s0.indexOf("1") 0) {
return s1;
}
//位數(shù)補齊
int len0 = s0.length();
int len1 = s1.length();
int minLen = Math.max(len0, len1);
s0 = buqi(len0, minLen) + s0;
s1 = buqi(len1, minLen) + s1;
for (int i = s0.length() - 1; i = 0; i--) {
String str0 = s0.substring(i, i + 1);
String str1 = s1.substring(i, i + 1);
add(result, jinwei, str0, str1);
}
String tmpJinwei = jinwei.reverse().toString() + "0";
jinwei.delete(0, jinwei.length());
String tmpResult = result.reverse().toString();
result.delete(0, result.length());
return test(result, jinwei, tmpJinwei, tmpResult);
}
private static void add(StringBuffer result, StringBuffer jinwei, String str0, String str1) {
// 00相加為0,不進位
if ("0".equals(str0) "0".equals(str1)) {
result.append("0");
jinwei.append("0");
return;
}
// 11相加為0,進位1
if ("1".equals(str0) "1".equals(str1)) {
result.append("0");
jinwei.append("1");
return;
}
// 其他情況,相加為1,不進位
result.append("1");
jinwei.append("0");
}
private static String buqi(int len0, int minLen) {
String tmp = "";
for (int i = len0; i minLen; i++) {
tmp += "0";
}
return tmp;
}
}
java中二進制的表示:
1、Java中定義兩個數(shù),然后分別打印出它們的二進制表示(例如7和-7):
System.out.println("Java二進制7:?"+Integer.toBinaryString(7));
System.out.println("Java二進制-7:?"+Integer.toBinaryString(-7));
輸出:
Java二進制7: 111
Java二進制-7: 11111111111111111111111111111001
7的二進制就是111
-7轉(zhuǎn)化二進制的過程:
(1)把-7轉(zhuǎn)化成7,二進制是 111
(2)Java中對于不滿32位的int二進制自動補齊,所以變成了 (29個0)111
(3)然后取反 ?(29個1)000
(4)然后加1 (29個1)001
擴展資料:
c語言中二進制的轉(zhuǎn)換:
用函數(shù)轉(zhuǎn)換itoa(值,數(shù)組名,進制)
#includestdio.h
#includestdlib.h
void?main()
{
char str[8];
int?i=8;
itoa(i,str,2);
printf("%s",str);
}
參考資料:
java二進制——百度百科