㈠ 跪求「java中二進制怎麼表示」
java中二進制的表示:
1、Java中定義兩個數,然後分別列印出它們的二進製表示(例如7和-7):
System.out.println("Java二進制7:"+Integer.toBinaryString(7));
System.out.println("Java二進制-7:"+Integer.toBinaryString(-7));
輸出:
Java二進制7: 111
Java二進制-7:
7的二進制就是111
-7轉化二進制的過程:
(1)把-7轉化成7,二進制是 111
(2)Java中對於不滿32位的int二進制自動補齊,所以變成了 (29個0)111
(3)然後取反 (29個1)000
(4)然後加1 (29個1)001
(1)tohexstringjava擴展閱讀:
c語言中二進制的轉換:
用函數轉換itoa(值,數組名,進制)
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
char str[8];
inti=8;
itoa(i,str,2);
printf("%s",str);
}
㈡ 用JAVA將十進制轉換成十六進制
1、用Integer.toHexString方法即可將十進制裝成十六進制。
package com.test;
public class Test {
public static void main(String[] args) {
int i = 123;
System.out.println(Integer.toHexString(i));
}
}
㈢ java中怎麼將10進制轉化成十六進制
1,可以手動計算先將10進制的數轉為二進制,二進制再轉為16進制
2,我們可以直接使用java api提供的方法直接轉換
int num = 14;
String hexNum = Integer.toHexString(num);
hexNum即為16進制的數
3,如圖
㈣ JAVA 在線等 急!!
importjava.util.Scanner;
publicclassComputerUtil{
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
floatnum1=0;
floatnum2=0;
intresult=0;
System.out.print("Inputnum1:");
num1=input.nextFloat();
System.out.print("Inputnum2:");
num2=input.nextFloat();
result=(int)(num1+num2);
System.out.println("num1:"+num1+"->"+(char)num1);
System.out.println("num2:"+num2+"->"+(char)num2);
System.out.println("result:"+result+"->"+(char)result);
input.close();
}
}
㈤ java中如何輸出字元變數的Unicode編碼值
java中可以使用char類提供的charAt()方法來獲得字元的unicode的編碼值,示例如下:
(5)tohexstringjava擴展閱讀:
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
參考資料:網路-java
㈥ 用JAVA把二進制數轉換成十進制數。
二進制轉十進制
Integer.valueOf("0101",2).toString()
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("輸入一個二進制數: ");
String a = sc.nextLine();
int d = Integer.parseInt(a, 2); // 2進制
int o = Integer.parseInt(a, 8); // 8進制
System.out.println("二進制轉為十進制: " + d);
System.out.println("八進制轉為十進制: " + o);
計算機內部使用二進製表示數
二進制與十進制的轉換是比較復雜的。比如我們要讓計算機計算50+50=?,那麼首先要把十進制的50轉換成二進制的「50」——110010,這個過程要做多次除法,而計算機對於除法的計算是最慢的。把十進制的50轉換成二進制的110010還不算完,計算出結果1100100之後還要再轉換成十進制數100,這是一個做乘法的過程,對計算機來說雖然比除法簡單,但計算速度也不快。
以上內容參考:網路-十進制
㈦ java如何編程實現,獲取固定IP發來所有的數據包
java獲取固定IP發來所有的數據包,需要實現網路嗅探的部分功能:
代碼如下;
/*******************
*JpcapTip.java
*/
packagem;
importjpcap.PacketReceiver;
importjpcap.JpcapCaptor;
importjpcap.packet.*;
importjpcap.NetworkInterface;
importjpcap.NetworkInterfaceAddress;
//importjava.net.InetAddress;
//importjava.net.UnknownHostException;
{
publicvoidreceivePacket(Packetpacket){
System.out.println("********************************************");
/*IP數據報報文頭*/
byte[]l=packet.header;
/*
for(intt=0;t<21;t++){
System.out.print(l[t]+"***");
}
*/
Stringstr="";
System.out.print("報文頭:");
for(inti=0;i<l.length;i++){
//str=str+l;
intm=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+Integer.toHexString(m);
//System.out.print("***"+l[i]);
}
System.out.println(str);
intd=l.length;
System.out.println("首部長度:"+(d*8)+"bit");
/*分析源IP地址和目的IP地址*/
/*分析協議類型*/
/**
if(packet.getClass().equals(IPPacket.class)){
IPPacketipPacket=(IPPacket)packet;
byte[]iph=ipPacket.option;
Stringiphstr=newString(iph);
System.out.println(iphstr);
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("協議類型:ARP協議");
try{
ARPPacketarpPacket=(ARPPacket)packet;
System.out.println("源網卡MAC地址為:"+arpPacket.getSenderHardwareAddress());
System.out.println("源IP地址為:"+arpPacket.getSenderProtocolAddress());
System.out.println("目的網卡MAC地址為:"+arpPacket.getTargetHardwareAddress());
System.out.println("目的IP地址為:"+arpPacket.getTargetProtocolAddress());
}catch(Exceptione){
e.printStackTrace();
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("協議類型:UDP協議");
try{
UDPPacketudpPacket=(UDPPacket)packet;
System.out.println("源IP地址為:"+udpPacket.src_ip);
inttport=udpPacket.src_port;
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為:"+udpPacket.dst_ip);
intlport=udpPacket.dst_port;
System.out.println("目的埠為:"+lport);
}catch(Exceptione){
e.printStackTrace();
}
}
else
if(packet.getClass().equals(TCPPacket.class)){
System.out.println("協議類型:TCP協議");
try{
TCPPackettcpPacket=(TCPPacket)packet;
inttport=tcpPacket.src_port;
System.out.println("源IP地址為:"+tcpPacket.src_ip);
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為:"+tcpPacket.dst_ip);
intlport=tcpPacket.dst_port;
System.out.println("目的埠為:"+lport);
}catch(Exceptione){
e.printStackTrace();
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("協議類型:ICMP協議");
else
System.out.println("協議類型:GGP、EGP、JGP協議或OSPF協議或ISO的第4類運輸協議TP4");
/*IP數據報文數據*/
byte[]k=packet.data;
Stringstr1="";
System.out.print("數據:");
for(inti=0;i<k.length;i++){
//intm=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+Integer.toHexString(m);
str1=newString(k);
//str1=str1+k[i];
//System.out.print("***"+k[i]);
}
System.out.println(str1);
System.out.println("數據報類型:"+packet.getClass());
System.out.println("********************************************");
}
publicstaticvoidmain(String[]args)throwsException{
//TODO自動生成方法存根
NetworkInterface[]devices=JpcapCaptor.getDeviceList();//.getDeviceList();.
//for(inti=0;i<devices.length;i++){
inta=0;
//try{
/*本地網路信息*/
byte[]b=devices[1].mac_address;//網卡物理地址
//}
//catch(){}
System.out.print("網卡MAC:00");
for(intj=0;j<b.length;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
System.out.print(Integer.toHexString(a));
}
System.out.println();
NetworkInterfaceAddress[]k=devices[1].addresses;
//System.out.println("網卡MAC:"+Integer.toHexString(a));
for(intn=0;n<k.length;n++){
System.out.println("本機IP地址:"+k[n].address);//本機IP地址
System.out.println("子網掩碼:"+k[n].subnet);//子網掩碼
}
System.out.println("網路連接類型:"+devices[1].datalink_description);
//}
NetworkInterfacedeviceName=devices[1];
/*將網卡設為混雜模式下用網路設備deviceName*/
JpcapCaptorjpcap=JpcapCaptor.openDevice(deviceName,2000,false,1);//openDevice(deviceName,1028,false,1);
jpcap.loopPacket(-1,newJpcapTip());
}
}
㈧ Java的小問題
一.double類型的存儲表示
Java的浮點類型表示完全按照IEEE754標准(Standards of IEEE 754 floating point numbers),有興趣可以上IEEE標准網站(www.ieee.org)查閱.該標準的內容基本上描述了浮點類型的存儲格式(Storage Layout),下面我從中總結幾段,來概括該標准,詳細信息請查閱標准原文.
1.什麼是浮點數.
計算機上表達實數有兩中方法:定點表示(fixed-point)和浮點表示(floating-point).定點表示法就是在現有的數字中間的某個位置固定小數點,整數部分和小數部分的表示和一個普通整數的表示法沒什麼兩樣.例如,我們的數字長度為4,小數點位於中間,那麼你可以表示10.28,也可以表示00.01,與這種方法性質類似的定點表示還有使用分數的形式.定點數的固定窗口形式使得他既不能夠表示非常大的數又不能表示非常小的數.並且當除法發生時,大量 的精度丟失.
浮點數採用科學計數法的形式來表示實數.例如123.456可以表示成1.23456×102.相對於定點數的固定窗口(fixed Window)的限制,它採用的是浮動窗口(sliding window),因此可以表示較大精度范圍的一個實數.
2.存儲布局(Storage Layout)
所謂的存儲布局就是一個浮點數在內存中如何表示.我們知道浮點數有float和double,前者是4個位元組也就是32位,後者是8個位元組也就是64位.布局分別為:
符號 指數 小數部分 偏移附加(bias)
單精度 1[31] 8[30-23] 23[22-00] 127
雙精度 1[63] 11[62-52] 52[51-00] 1023
中括弧內為位的編號范圍,外面為該部分所佔有的位的數量.偏移附加不屬於位表示的內容,是一個常量,稍後解釋.
符號只有一位:0-表示正數 1-表示負數
指數部分:用指數部分的值(8位/11位,unsigned)的值 減去 偏移附加 得到該數實際的指數 例如值為200,實際指數為73=200-127.對於雙精度的double來說常量bias=1023
尾數:尾數是什麼?對於一個科學計數法來講,形式象這樣的 L.M×BE,那麼這個L.M就是所謂的尾數(mantisa).它由一個起始位和一個小數部分組成.舉個例子,5可以用科學計數法表示成不同形式:
5*100
0.5*101
50*10-1
那麼我們引進一個概念,規范化形式(normalized form)和非規范化形式(denormalized form).我們定義規范化形式為小數點位於第一個不為0的數字後面的表達形式為規范化形式,因此上面的第一種形式為規范化形式,其他的為非規范化形式,Java中的浮點表示完全按照這個標准,只有兩種形式規范化形式:1.f 和 非規范化形式 0.f .
那麼,對於我們的位布局來說,選用底數為2的話,只有一個數字是非零的,那就是1.所以我們的隱含起始數字可以不用佔用一個位,因為除了0就只能是1,具體的隱含規則,稍後展示.
3.表示的意義.
對應於上面的表格,每一個區域對應的值的范圍所表示的浮點數的意義:
符號位s 指數位e 小數位f 所表示的意義v
0 00..00 00..00 +0
0 00..00 00..01
:
11..11 正的非規范實數,計算方法v=0.f × 2(-b+1)
0 00..01
:
11..10 XX..XX 正的規范化實數,計算方法v=1.f × 2(e-b)
0 11..11 00..00 正的無窮大
0 11..11 00..01
:
01..11 無意義的非數字SNAN
0 11..11 10..00
:
11..11 無意義的非數字QNAN
其中b=127(float)/b=1023(double),SNAN表示無效運算結果,QNAN表示不確定的運算結果,都是無意義的.
如果把符號位s改成1,那麼就全部都是負數的含義,其他意義和這相同.
另外我們看到,對於無意義的數字是指數部分為全1時,也就是說這里有很多種組合都是無意義的非數字,而我們的Java中,判斷一個數字是否是NAN的做法相當簡單
static public boolean isNaN(double v) {
return (v != v);
}
從這里可以看出來,虛擬機對於double類型的數據比較時,肯定是先做了指數值的判定,發現不是全1時才作內存的逐位比較.當然這是我得推測,真像不知道是否如此.
再另外,我們''現在十分清楚,double類型所能表示的最小值就是它的值之間的距離,也就是我們所說的精度,數字按這種精度向整數"1階梯式的累加時,正好不能和1完全匹配,換句話說,1不是最小值(精度/距離)的整數倍.因此如果你設置變數 double d = 0.1;而結果不會是0.1,因為無法表示0.1;
二.怎麼查看double類型的存儲結構?
我們很清楚Java的Double類型提供一個函數叫做doubleToLongBits函數,這個函數的其實很簡單,我們知道,long類型和double類型都是64位的,他們的內存大小一樣,這個函數的做法就是把double對應的內存結構復制到同樣大小的long類型變數的內存結構中.返回這個long值.因為Java不支持對double類型做位運算,因此:
1.該函數不可能用Java語言完成,所以他是JNI實現
2.我們利用對long類型的位運算可以把該內存結構列印出來查看.
/**
* 測試
*/
public static void main(String[] args){
myTest t = new myTest();
double d = 0.1d;
long l = Double.doubleToLongBits(d);
System.out.println(t.getLongBits(l));
}
/**
* 得到常整數的bit位表示字元串
* @param a
* @return
*/
public String getLongBits(long a){
//8個位元組的位元組數組,讀出來
byte[] b = new byte[8];
for(int i=7;i>=0;i--){
b[i] = (byte)(a&0x000000FF);
a = a>>8;
}
return this.byte2hex(b); //調用下面一個函數
}
/**
* 位元組數組轉換成字元串
* @param b
* @return
*/
public static String byte2hex(byte[] b){
StringBuffer sb=new StringBuffer();
String stmp="";
for(int n=0;nstmp=(Integer.toHexString(b[n]&0XFF));
if(stmp.length()==1){
//不足兩位的末尾補零
sb.append("0"+stmp);
} else{
sb.append(stmp);
}
if(n//":"作為分割符
sb.append(":");
}
}
return sb.toString().toUpperCase();
}
0.1列印出來的內存結果是:
3F:B9:99:99:99:99:99:9A
我們恢復一下和第一節的表示意義對照表對照一下:
0 01111111011 1001.....1010
有興趣的話,可以那科學計算器按照第一節的規則計算一下它的值,哦,正好就是我們通過System.out.println(d)列印的結果.
㈨ java基礎問題
JimmyPerson@de6ced是輸出的字元串「Jimmy」加上這個jimmy類,
jdk中的System.out.println( )提供了對對象的輸出方式,所有java類都繼承Object這個類,去看看API可以知道該類的toString方法,具體可以查看java源代碼。我找了部分源代碼,如下
System.out.println("Jimmy" + jimmy );
->public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
其中print(x)中x參數可以是基本類型,string類型,還有Object,輸出Object的代碼如下:
public void print(Object obj) {
write(String.valueOf(obj));
}
而String.valueOf(obj)就是調用toString方法,代碼如下:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
先在再看看toString里是什麼內容,閣下就知道了,代碼如下
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
其中getClass().getName()是輸出類的類名,Integer.toHexString(hashCode())是將類的內容以哈希值轉化為16進制輸出
|
javaJDK裡麵包含了源代碼,查看源代碼,看看別人的精髓也是一種不錯的學習方法
㈩ java中如何將十進制數字轉化成二進制
如果表達小於2^31-1的正數代碼如下:
public void binaryToDecimal(int n){
int t = 0; //用來記錄位數
int bin = 0; //用來記錄最後的二進制數
int r = 0; //用來存儲余數
while(n != 0){
r = n % 2;
n = n / 2;
bin += r * Math().pow(10,t);
t++;
}
System.out.println(bin);
}
使用字元串的拼接(+)來實現大於2^31-1的數,代碼如下:
public void binaryToDecimal(int n){
String str = "";
while(n!=0){
str = n%2+str;
n = n/2;
}
System.out.println(str);
}
可以右移後再與0x01進行&運算得到第一位的數字判斷判斷它的第幾位上是0,第幾位上是1,代碼如下:
class ByteMove
{
public static void main(String[] args)
{
int i = 7;
move(i);
}
static void move(int num){
for(int i= 0;i<6;i++){
System.out.println("第"+(i+1)+"位:" + (num >> i & 0x01));
}
}
}