目次
ビット演算
コードのデモ
コード
結果
ビット演算の応用
ホームページ Java &#&チュートリアル Javaビット動作サンプルコード解析

Javaビット動作サンプルコード解析

Apr 23, 2023 pm 01:52 PM
java

ビット演算

ビット演算は昔に習ったのですが、長い間使っていなかったので、ほとんど忘れてしまったような気がします。最近、ビット算術のコードをいくつか調べましたが、すべてを理解できないことがわかりました(笑)。もう一度戻って基本を理解する時期が来ました。

プログラム内のすべての数値は、コンピューターのメモリにバイナリ形式で保存されます。ビット操作は、メモリ内の整数のバイナリ ビットを直接操作します。

#ビット演算の演算子:

#演算子#意味ビット単位またはビット単位またはビット単位の否定ビット単位 XORシフト左記号を使用して右にシフト##>> ;>符号なし右シフト

とても基礎的な知識ですが、長期間使わないと忘れてしまいますので、コーディングしながらどんどん活用していきましょう!

話は安いので、コードを見せてください。

注: これらを単独で議論すると、アプリケーションを見るのは非常に困難です。他の人のまとめもチェックできます。

コードを使用してビット演算のアプリケーションを見てみましょう:

public final void writeInt(int v) throws IOException {
	  out.write((v >>> 24) & 0xFF);
	  out.write((v >>> 16) & 0xFF);
	  out.write((v >>>  8) & 0xFF);
	  out.write((v >>>  0) & 0xFF);
	  incCount(4);
}
ログイン後にコピー

このコードは、DataOutputStream クラスのメソッドであり、int 型の整数を変換するために使用されます。ストリームに書き込みます。このメソッドのネーミングは非常に興味深いもので、OutputStreampublic abstract void write(int b) throws IOException とはまったく異なります。このメソッドのパラメータは、ストリームに整数を書き込むことができることを示しているようですが、メソッドの機能は推測されず、メソッドの説明に依存します。

public abstract void write(int b) throws IOException
ログイン後にコピー

API の概要:

指定されたバイトをこの出力ストリームに書き込みます。write の一般的な規約は、1 バイトが出力ストリームに書き込まれることです。書き込まれるバイトは、引数 b の下位 8 ビットです。b の上位 24 ビットは無視されます。

it Itストリームに特定のバイトを書き込むことです。int 型変数は 32 ビット、バイトは 8 ビットを占めることがわかっているため、256 (2^8) 未満の int 型整数とバイト型整数の最後の 8 ビットは同一です。

つまり、この方法では、int 変数の下位 8 ビットを書き込み、残りの 24 ビットを無視します。この方法を使用する場合は特に注意してください。

書き込まれるバイトは、引数 b の下位 8 ビットです。b の上位 24 ビットは無視されます。

したがって、int 型変数を完全にストリームに書き込むことは、それほど単純な問題ではありません。上記のコードに戻りますが、1 バイトのデータを 4 回連続して書き込むことで、int 型の変数が 4 バイトに変換されてストリームに書き込まれます。

out.write((v >>> 24) & 0xFF); このメソッドは、上記の下位 8 桁の数字を書き込むことであり、この特定の実装は対応しています。サブクラスごとに。

図を見てみましょう: 単純な AND 演算: 演算の結果は、下位 8 ビット、つまり (v>>>24) & を保持していることがわかります。 0xFF 操作の結果。

Javaビット動作サンプルコード解析

では、上位 8 ビット値を取得するにはどうすればよいでしょうか?これにはシフト演算を使用する必要があります。

Javaビット動作サンプルコード解析

#シフト演算を実行することで、各 8 ビットのデータを取得し、ビット単位の AND & 演算を実行することで、完全に行うことができます。整数をストリームに書き込みます。

コードのデモ

コード
package dragon;

/**
 * 分析这一个方法,目前水平有限,先从最简单的做起!
 * */

//		   public final void writeInt(int v) throws IOException {
//        out.write((v >>> 24) & 0xFF);
//        out.write((v >>> 16) & 0xFF);
//        out.write((v >>>  8) & 0xFF);
//        out.write((v >>>  0) & 0xFF);
//        incCount(4);
//    }


//上面这段代码是将一个32位整型,写入输出流。
//并且是将32位整型分为4个部分,每次写入8位。
//这是Java的特性。


public class DataOutputStreamAnalysis {
	public static void main(String[] args) {
		DataOutputStreamAnalysis analysis = new DataOutputStreamAnalysis();
		analysis.analysis(65535);
	}
	
	public void analysis(int number) {
		int number1, number2, number3, number4;  //后面的数字表示是一个32位整型的第几个8位。
		number1 = (number >>> 24) & 0xFF;    
		number2 = (number >>> 16) & 0xFF;    
		number3 = (number >>> 8) & 0xFF;
		number4 = (number >>> 0) & 0xFF;
		
		
		
		System.out.println(this.format(Integer.toBinaryString(number))+"  原始数据"); 
		System.out.println(this.format(Integer.toBinaryString(number1))+"  原始数据第一个8位");
		System.out.println(this.format(Integer.toBinaryString(number2))+"  原始数据第二个8位");
		System.out.println(this.format(Integer.toBinaryString(number3))+"  原始数据第三个8位");
		System.out.println(this.format(Integer.toBinaryString(number4))+"  原始数据第四个8位");
	}
	
	/**
	 * 输入一个二进制字符串,将其格式化,因为整型是
	 * 占32位的,但是转换成的二进制字符串,并没有32位*/
	public String format(String bstr) {
		int len = bstr.length();
		StringBuilder sb = new StringBuilder(35);
		for (int i = 0; i < 32-len; i++) {
			sb.append("0");
		}
		sb.append(bstr);
		sb.insert(8, " ");
		sb.insert(17, " ");
		sb.insert(26, " ");   //前面插入一个字符后,所有字符的索引都变了!
		return sb.toString();
	}
}
ログイン後にコピー
結果

Javaビット動作サンプルコード解析

説明: 負の数は使用できません。ここで考慮する 状況は同じですが、負の数の表現が少し面倒になります。正の数を理解している限り、負の数は問題ありません。

ビット演算の応用

1. int 型変数 x が奇数か偶数かを判定

ビットごとの AND 演算を実行します。変数 x と 1 の結果が 0 の場合、変数 x は偶数であり、それ以外の場合は奇数です。

if (x & 1 ==0) 
	System.out.println("x是偶数");
if (x & 1 == 1) 
    System.out.println("x是奇数");
ログイン後にコピー

説明: 偶数の最終シフトは 0 でなければならないため、これでも理解しやすいです。 (バイナリ表現)

2. int 型変数の k 番目のビットを取得します ビットのバイナリ値。

式:

x >> k & 1 (わかりやすくするために括弧を追加することをお勧めします。)

3. int 型を変更します。変数のk番目の位置1 式:

x = x | (1 << k)

4. int 型変数の k 番目のビットを 0 クリアします。

1をkビット左にシフトし、その結果を反転して変数に加えて論理演算すると、変数xのk番目のビットが0にクリアされ、他のビットは変更されません。 式ビット:

x = x & ~(1 << k)

##5. 2 つの整数の平均を計算します

式ビット:(x & y) ((x ^ y) >> 1)

6. 1 より大きい整数 x について、次のことを判断します。 x は 2

if (x & (x-1) == 0)
	System.out.println("x是2的次幂");
ログイン後にコピー
7 の累乗です。数値を 2

の n 乗で乗算します。式: x = x

例: x を 2 倍に拡張します: x = x

ビット単位の演算が推奨される理由:

ビット操作は必要な命令が少なく、実行に必要な時間が短いため、ビット操作の速度は算術演算よりも高速です。ビット操作は非常に高速に見えますが、ビット操作は多数の実行が行われた場合にのみ確認できます。運用上のメリット結局のところ、今日のコンピューターはますます高速になっています。

#&
#|
~
^
>>

以上がJavaビット動作サンプルコード解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles