回覆列表
  • 1 # Java小助手

    你好,Java裡最基礎的單位是Byte,Byte的下一級單位是bit,然而Java中並不直接提供對bit的操作。所以需要自己寫工具類來實現。一個Byte=8個bit。

    這種直接對bit的操作一般情況不會用到。但是當需要用較少的byte表示較多的值的時候就會用到。比如軟硬體結合需要發報文的專案。就會用一個byte表示8個不同情況。

  • 2 # KingOfTheForest

    首先,我們先確定幾個基礎的概念:

    1.1個int佔用4個byte;

    2.1個byte佔用8個bit;3.byte的最高位為符號位,剩餘7位為數值位,符號位為0表示正數,1為負數;4.在計算機中數值以二進位制的補碼形式儲存。好。繼續拓展,理解一下原碼、反碼和補碼概念:原碼:將一個數值以二進位制的形式展示;反碼:正數的反碼就是它的原碼,負數的反碼就是原碼的符號位不變,數值位取反;補碼:正數的補碼就是它的原碼,負數的補碼就是反碼的符號位不變,數值位加1;

    比如說:15的原碼是00001111,而-15的原碼就是在符號位加1,也就是1000‭1111

    所以-15在計算機中儲存的補碼就是11110001了。在這裡再稍微拓展一點點,補碼是什麼東西?根據數學的定義,在十進位制裡:4+6=10 3+7=10,所以說4和6互補,3和7也是互補,那有什麼意義呢?再來舉個例子,8-4=4 8+6=14(4和6互補),我們可以看到8減去4或者8加上4的補碼6,得到數的個位數是一樣的,都是4,大家可以自己去嘗試一下,其他二進位制、八進位制等等都是一樣的。說了這麼多,那到底有什麼用呢,其實就是避免了減法,採用補碼之後,可以將減法處理成加法,本來是-4的,那我們就+6,只要把得到高位去掉,那麼得到的值,是和減法一樣的。我們都知道,在計算機裡其實是沒有乘除的,一切的乘除都可以轉化為加減,看上面我們可以知道減法也是可以由加法代替的,那麼在最後,計算機只要能算加法就可以了。好了,言歸正傳,上面我們說到1個int佔用4個byte,1個byte佔用8個bit,那麼1個int就是32個bit,然後它們是byte為單位、以補碼的形式儲存的,而且是先存低位,再存高位。舉個例子 :20180717就是用4個byte儲存,細化到bit就是32個,就是下面這樣的,當然了,現在這個就是20180717的原碼00000001001100111110111011101101‬4個byte分別就是"00000001"、"00110011"、"11101110"、"11101101‬";計算機在儲存的時候,就會把它們轉成補碼的形式,而20180717的補碼就是它本身,但是byte的儲存是從低到高的,所以20180717在計算機記憶體裡表示就是"11101101‬"、"11101110"、"00110011"、"00000001"再舉個例子:-20180717負數的原碼就是它的正數原碼最高位(符號位)加1,也就是說-20180717表示是這樣的原碼:10000001 00110011 11101110 11101001‬反碼:11111110 11001100 00010001 00010110補碼:11111110 11001100 00010001 00010111-20180717在計算機記憶體裡表示就是"00010111"、"00010001"、"11001100"、"11111110"

    我們可以在計算器內很直觀的看到-20180717的二進位制補碼顯示

    而我們透過Visual Stuido 2013的反彙編視窗和記憶體顯示視窗也可以清楚看到-20180717的16進位制顯示和在記憶體裡的16進位制顯示透過計算器或者反彙編視窗我們都可以得出FECC1113就是-20180717的16進位制透過記憶體窗口裡的13 11 cc fe我們就可以看到-20180717是按byte的低位到高位的排列方式進行儲存的

    因為13正是一個byte"00010111"的16進位制,11是"00010001"的16進位制,cc是"11001100"的16進位制,fe是"11111110"的16進位制

  • 3 # 劉某人程式設計師

    首先要明白一點,Java中時沒有bit的資料型別的,所以如果想表示bit,可以使用byte [] 的方式

    1 byte = 8 bit

    只要把每位提取出來,需要把它 右移至右邊第一位 ,在和1 進行與運算 ,這樣除了需要的bit, 其他都為0 。其2進位制(1,0),正好為數字1,0;

    所以我們可以封裝如下:

    //byte轉bit

    public static byte[] ByteToBit (byte a) {

    byte[] temp= new byte[8];

    for (int i = 7; i >= 0; i--) {

    temp[i] = (byte)((a >> i) & 1);

    }

    return temp;

    }

    //bit轉byte

    public static byte BitToByte(byte[] a) {

    byte temp = (byte) 0;

    for (int i = 0; i < bits; i++) {

    temp = temp | a[i] << i;

    }

    return temp ;

    }

  • 中秋節和大豐收的關聯?
  • 開車換擋時候腳怎麼踩?