Java中對于unsigned byte類型的轉(zhuǎn)換處理

問題由來


在閱讀google的開源項目zxing時,遇到以下代碼:


public final String toString() {
    byte[] row = new byte[width];
    StringBuilder result = new StringBuilder(height * (width + 1));
    for (int y = 0; y < height; y++) {
      row = getRow(y, row);
      for (int x = 0; x < width; x++) {
        int luminance = row[x] & 0xFF;  
        char c;
        if (luminance < 0x40) {
          c = '#';
        } else if (luminance < 0x80) {
          c = '+';
        } else if (luminance < 0xC0) {
          c = '.';
        } else {
          c = ' ';
        }
        result.append(c);
      }
      result.append('\n');
    }
    return result.toString();
  }

閱讀到上述源代碼時,對于int luminance = row[x] & 0xFF;最初不是很理解。查詢之后,發(fā)現(xiàn)原來Java中是沒有unsigned byte type的。也就是說Java中所有的byte類型都是signed類型。只能表達(dá)(-128127).而此處的代碼為了讀取像素值,所需要的值是(0255),所以需要的是unsigned byte而不是signed byte。但是Java中所有的byte都是signed byte。那怎么處理呢?

Java中unsigned byte 的轉(zhuǎn)換

正如上述我們看到的代碼所示:
int luminance = row[x] & 0xFF;
首先widening類型。將byte聲明為short或者int類型。然后與0xFF取&即可。

下面,具體說明這樣做的原理。
0xff 表示為二進(jìn)制就是 1111 1111。在signed byte類型中,代表-1;但在short或者int類型中則代表255.
當(dāng)把byte類型的-1賦值到short或者int類型時,雖然值仍然代表-1,但卻由1111 1111變成1111 1111 1111 1111.
再將其與0xff進(jìn)行掩碼:
-1: 11111111 1111111
0xFF: 00000000 1111111
255: 00000000 1111111
所以這樣,-1就轉(zhuǎn)換成255.

測試程序

我們寫了一個簡單的程序?qū)ζ溥M(jìn)行Java unsigned byte 類型轉(zhuǎn)換的測試:
for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++) { short s = b; s &= 0xff; System.out.println(b + " & 0xFF = " + s); }
將所有的byte值進(jìn)行循環(huán)轉(zhuǎn)換,輸出結(jié)果如下:
-128 & 0xFF = 128 -127 & 0xFF = 129 .... -2 & 0xFF = 254 -1 & 0xFF = 255 0 & 0xFF = 0 1 & 0xFF = 1 ... 125 & 0xFF = 125 126 & 0xFF = 126

小結(jié)

Java的unsigned byte 類型轉(zhuǎn)換屬于一個細(xì)節(jié)問題,由于java中沒有內(nèi)置unsigned byte類型,所以當(dāng)我們需要使用其時,需要對signed byte 類型進(jìn)行轉(zhuǎn)換。而這種轉(zhuǎn)換是比較簡單的,首先將其擴大類型到short或者int,然后對0xff進(jìn)行掩碼即可。

備注

2016.7.5閱讀zxing源碼時的小問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一類:邏輯型boolean 第二類:文本型char 第三類:整數(shù)型(byte、short、int、long) c...
    Jasonme閱讀 1,189評論 0 4
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,360評論 6 13
  • 1、在計算機內(nèi),有符號數(shù)有3種表示法:原碼、反碼和補碼 原碼: 原碼就是符號位加上真值的絕對值,即用第一個二進(jìn)制位...
    DevWang閱讀 11,302評論 2 54
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,644評論 18 399
  • 2015年港股雜記 拆股錢入700:時機一錯,步步錯 出700:勝利之時,當(dāng)及時收手 出金山:看好的要穩(wěn)住,持有太...
    galoistang閱讀 658評論 0 0

友情鏈接更多精彩內(nèi)容