[解決済み] 0x7fのどこが特別なんだ?
2022-02-02 02:39:06
質問
avroフォーマットの仕様書を読み、その実装を理解しようとしています。以下はデコードのためのメソッドです。 長い値 :
@Override
public long readLong() throws IOException {
ensureBounds(10);
int b = buf[pos++] & 0xff;
int n = b & 0x7f;
long l;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 7;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 14;
if (b > 0x7f) {
b = buf[pos++] & 0xff;
n ^= (b & 0x7f) << 21;
if (b > 0x7f) {
// only the low 28 bits can be set, so this won't carry
// the sign bit to the long
l = innerLongDecode((long)n);
} else {
l = n;
}
} else {
l = n;
}
} else {
l = n;
}
} else {
l = n;
}
if (pos > limit) {
throw new EOFException();
}
return (l >>> 1) ^ -(l & 1); // back to two's-complement
}
問題は、なぜ常に
0x7f
が、今読んだバイトより少ないのですか?
解決方法は?
これは、ビットパックの一種で、それぞれの最上位ビットが
byte
は、別の
byte
を読み取る必要があります。 基本的に、これにより、通常必要とされるよりも少ないバイト数で値をエンコードすることができる。 ただし、数値が大きい場合は、その数値よりも多くの
通常の
のバイト数が必要となる。 したがって、これは小さな値を扱うときに成功する。
質問に入ります。
0x7F
は
0111_1111
を2進数で表したものです。 最上位ビットがフラグビットとして使用されていることがわかります。
関連
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
-
[解決済み] JavaにおけるSoftReferenceとWeakReferenceの違いは何ですか?
-
[解決済み] ConcurrentHashMapとCollections.synchronizedMap(Map)の違いは何ですか?
-
[解決済み] JavaでgetPath()、getAbsolutePath()、getCanonicalPath()はどう違うのですか?
-
[解決済み】インプリメントとエクステンド。いつ使う?その違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Eclipseで「公開型 <<classname>> は独自のファイルで定義する必要があります」エラー【重複あり
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】スレッド "main "での例外 java.util.NoSuchElementException
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み】CreateProcess error=2, The system cannot find file specified.
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)