3.深入jvm核心-原理、診斷與優化-1.初始jvm
阿新 • • 發佈:2019-09-22
一、 初始jvm
-
有關補碼,簡要闡述補碼的好處。並計算給出 -99, -105, 205 整數的補碼
答:簡述補碼的好處: 在人們的計算概念中零是沒有正負之分的,統一0的處理 統一處理加減法,無需增加減法器操作 正數二進位制的補碼等於它本身,負數的二進位制補碼等於取反+1 -99: 原碼:11100011 反碼 :10011100 補碼 :10011101 其它的我直接給出補碼了: -105:10010111 205:00000000 11001101
-
有關浮點數,根據IEEE745,計算11000001000100000000000000000000的單精度浮點的值,並給出計算過程。
1 符號位 10000010 值是3 00100000000000000000000 值是1.001 = -1 * (2^3)*(2^0 + 2^-3) = -8*(1+8/1) = -8 -1 = -9
100.2轉成IEEE745 二進位制 拆解分析:
1、十進位制轉二進位制(32位),整型部分除2取餘,小數部分成2取整。 100.2 = 1100100.0011001100110011001100110 2、指數格式化(保留一位非零整數) 1.1001000011001100110011001100110*2^6(整數一位為隱藏附加位) 3、計算8位指數 6+127=133=10000101 (6為第二步的指數) 4、獲得IEEE745二進位制表示 0 10000101 10010000110011001100110 符號位 指數 尾數
IEEE 754
原碼,反碼,補碼
基礎型別(元型別變數之間賦值修改不會相互影響)
如果是物件引用同一個例項,物件之間賦值修改會相互影響
-
寫一個Java程式,將100.2轉成IEEE745 二進位制表示 ,給出程式和結果。
結果:01000010110010000110011001100110 程式( 偷懶了)方法一: ``` public static void main(String[] args) { String value=convert(100.2f); System.out.println(value); } public static String convert(float num) { int intVal = Float.floatToIntBits(num); return intVal > 0 ? "0" + Integer.toBinaryString(intVal) : Integer .toBinaryString(intVal); } ```
(沒偷懶)方法二:
``` package com.tencent.tubemq.example; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * description: * * @author: dawn.he QQ: 905845006 * @email: [email protected] * @email: [email protected] * @date: 2019/9/20 3:15 PM */ public class DeadLockDemo { private static String A = "A"; private static String B = "B"; static class Value { int val; } static class Test { public static void main(String[] args) throws InterruptedException { new DeadLockDemo().n2(3,3); System.out.println(new DeadLockDemo().floatToIEEE754(100.2f)); } } /** * 執行緒死鎖 */ private void deadLock() { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (A) { try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println("1"); } } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (B) { synchronized (A) { System.out.println("2"); } } } }); t1.start(); t2.start(); } /** * 單精度浮點數 轉成 IEEE745 * @param strf = 100.2f * @return String 1-100100-0011001100110011001100110 * @author Monkey * */ /** * 獲取float的IEEE754儲存格式 */ public String floatToIEEE754(float value) { //符號位 String sflag = value > 0 ? "0" : "1"; //整數部分 int fz = (int) Math.floor(value); //整數部分二進位制 String fzb = Integer.toBinaryString(fz); //小數部分,格式: 0.02 String valueStr = String.valueOf(value); String fxStr = "0" + valueStr.substring(valueStr.indexOf(".")); float fx = Float.parseFloat(fxStr); //小數部分二進位制 String fxb = toBin(fx); //指數位 String e = Integer.toBinaryString(127 + fzb.length() - 1); //尾數位 String m = fzb.substring(1) + fxb; String result = sflag + e + m; while (result.length() < 32) { result += "0"; } if (result.length() > 32) { result = result.substring(0, 32); } return result; } private String toBin(float f) { List<Integer> list = new ArrayList<Integer>(); Set<Float> set = new HashSet<Float>(); int MAX = 24; // 最多8位 int bits = 0; while (true) { f = calc(f, set, list); bits++; if (f == -1 || bits >= MAX) break; } String result = ""; for (Integer i : list) { result += i; } return result; } private float calc(float f, Set<Float> set, List<Integer> list) { if (f == 0 || set.contains(f)) return -1; float t = f * 2; if (t >= 1) { list.add(1); return t - 1; } else { list.add(0); return t; } } /**j 的n次方 */ public void n2(int j, int n) { if (j == 0) { j = 2; } int k = 0; for (int i = 0; i < n; i++) { if (k == 0) { k = 1 * j; } else { k = k * j; } } System.out.println(k); } } ```