ホームページ Java &#&チュートリアル 3 番目の変数を使用せずに 2 つの変数の値を交換する 4 つの方法

3 番目の変数を使用せずに 2 つの変数の値を交換する 4 つの方法

Jun 26, 2017 am 09:19 AM
交換 使用 変数

通常、私たちが行うこと (特に学習段階) は、新しい変数を定義し、それを使用して交換を完了することです。コードは次のとおりです:
int a,b;
a=10; b=15;int t;
t=a; a=b; b=t;
ログイン後にコピー

このアルゴリズムは理解しやすく、初心者がコンピュータ プログラムの特性を理解するのに特に適しています。代入ステートメントの古典的な応用です。実際のソフトウェア開発では、このアルゴリズムは単純明快で曖昧さがなく、プログラマ間のコミュニケーションが容易であり、変数値の交換の問題が発生した場合には、通常、このアルゴリズム (以下、標準アルゴリズムと呼びます) を使用する必要があります。


上記のアルゴリズムの最大の欠点は、一時変数の使用が必要なことです。それでは、一時変数の助けを借りずに交換を実現できるのでしょうか?答えは「はい」です!ここでは、1) 算術演算、2) ポインター アドレス演算、4) スタック実装の 3 つのアルゴリズムを使用できます。

1)四則演算
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10
ログイン後にコピー

原理は、aとbを数値軸上の点として扱い、2点間の距離を中心に計算します。

具体的なプロセス: 最初の文「a=b-a」は 2 点 ab 間の距離を求め、それを a に保存します。2 番目の文「b=b-a」は、a から原点までの距離 (b 間の距離) を求めます。 3 番目の文「a=b+a」は、b から原点までの距離 (a から原点までの距離と 2 点間の距離の合計) を求めます。 2 点間の距離 ab) を取得し、a に保存します。交換を完了します。
標準アルゴリズムと比較して、このアルゴリズムには計算プロセスが 3 つ増えていますが、一時変数は使用されません。 (以下、算術アルゴリズムと呼びます)
欠点: 数値型にのみ使用でき、文字列などには使用できません。 a+b はオーバーフローする可能性があります (int の範囲を超えます)。オーバーフローは、+ がオーバーフローした場合、- が戻ってきた場合は問題ありません。つまり、オーバーフローするかどうかは問題ではありません。

2) ポインタアドレス演算
アドレスの演算は実際には整数演算を実行するため、たとえば: 2 つのアドレスが減算されて、メモリ内の 2 つの変数の格納位置が何バイト離れているかを示す整数が追加されます。つまり、「a+10」は、a をベース アドレスとして、a の後の 10 クラス a データ単位のアドレスを表します。したがって、理論的には、アドレスの交換は算術アルゴリズムと同様の操作で完了し、変数を交換する目的を達成できます。つまり、
int *a,*b; //假设*a=new int(10);*b=new int(20); //&a=0x00001000h,&b=0x00001200ha=(int*)(b-a); //&a=0x00000200h,&b=0x00001200hb=(int*)(b-a); //&a=0x00000200h,&b=0x00001000ha=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
ログイン後にコピー

上記の操作により、実際に a と b のアドレスが交換され、a は元々 b が指した値を指し、b は元々 a が指した値を指すのでしょうか?上記のコードはコンパイルできますが、実行結果は驚くべきものです。なぜ?

まず、オペレーティングシステムがメモリをシステムコード/データ領域、アプリケーションコード/データ領域、スタック領域、グローバルデータ領域などのいくつかの領域に分割していることを理解する必要があります。ソースプログラムをコンパイルする際、定数やグローバル変数などはグローバルデータ領域に配置され、ローカル変数やダイナミック変数はスタック領域に配置されます。このように、「a=(int*)(b-a)」というアルゴリズムを実行すると、aの値は0x00000200hではなく、変数aが配置されているメモリ領域のベースアドレスとなり、実際の結果は0x008f0200hとなります。ここで、0x008f はベース アドレス 0200 で、メモリ領域内の a の変位です。コンパイラによって自動的に追加されます。その結果、今後のアドレス計算が正しくなくなり、a と b がエリア内の他のメモリ ユニットを指すようになります。第三に、負の数はアドレス演算で使用できません。つまり、a のアドレスが b のアドレスより大きい場合 (b-a解決策はありますか?確かに!改良されたアルゴリズムは次のとおりです:
if(a<b)
{
a=(int*)(b-a);
b=(int*)(b-(int(a)&0x0000ffff));
a=(int*)(b+(int(a)&0x0000ffff));
}else{
b=(int*)(a-b);
a=(int*)(a-(int(b)&0x0000ffff));
b=(int*)(a+(int(b)&0x0000ffff));
}
ログイン後にコピー

アルゴリズムの最大の改良点は、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、最後の 16 ビットであるため、ビット演算で AND 演算「int(a)&0x0000ffff」を使用することです。 16 ビットはディスプレースメント アドレスです。0x0000ffff との AND 演算の後、セグメント アドレスはマスクされ、ディスプレースメント アドレスのみが保持されます。これは元のアルゴリズムと一致し、正しい結果が得られます。

このアルゴリズムも、算術アルゴリズムと比較すると、3番目の変数を使用せずに値の交換を完了しますが、大きなデータ型を交換する場合、その実行速度が算術アルゴリズムよりも速いという利点があります。アドレスは交換しますが、変数値はメモリ内に移動されていないためです。 (以下、アドレスアルゴリズムと呼びます)

3) ビット演算
int a=10,b=12; //a=1010^b=1100;a=a^b; //a=0110^b=1100;b=a^b; //a=0110^b=1010;a=a^b; //a=1100=12;b=1010;
ログイン後にコピー

このアルゴリズムの実装は、XOR 演算を通じてデータ内の一部のビットを反転することができます。他のビットは変更されません。これは、任意の数値と任意の値が連続 2 回 XOR 演算され、値は変更されないことを意味します。

4) スタックの実装。スタックおよび関連する関数の定義は省略されているため、これ以上の説明は不要です。
int exchange(int x,int y) 
{ 
     stack S; 
     push(S,x); 
     push(S,y); 
     x=pop(S); 
     y=pop(S); 
}
ログイン後にコピー

上記のアルゴリズムはすべて、他の変数の助けを借りずに 2 つの変数値の交換を実現します。それに比べて、算術アルゴリズムとビット演算は同じ量の計算を必要とします。アドレス アルゴリズムの計算はより複雑です。ただし、最初の 2 つは整数データのみを交換できるのに対し、大規模な計算 (カスタム クラスや構造体など) を簡単に実現できます (理論上、「^」演算子をオーバーロードすると、任意の構造体の交換も実現できます)。 )。

これら 3 つのアルゴリズムの紹介は、実際に適用することを目的としたものではなく、テクノロジーについて説明し、プログラミングの魅力を説明することを目的としています。このことからも、数学のちょっとしたスキルがプログラミングに大きな影響を及ぼし、正しく使えば思わぬ魔法のような効果を発揮することが分かります。実際のソフトウェア開発の観点から見ると、標準アルゴリズムが間違いなく最適であり、あらゆる種類の交換問題を解決できます。

以上が3 番目の変数を使用せずに 2 つの変数の値を交換する 4 つの方法の詳細内容です。詳細については、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)

mdfおよびmdsファイルの使用方法 mdfおよびmdsファイルの使用方法 Feb 19, 2024 pm 05:36 PM

mdf ファイルと mds ファイルの使用方法 コンピューター技術の継続的な進歩により、さまざまな方法でデータを保存および共有できるようになりました。デジタル メディアの分野では、特殊なファイル形式に遭遇することがよくあります。この記事では、一般的なファイル形式である mdf および mds ファイルについて説明し、その使用方法を紹介します。まず、mdf ファイルと mds ファイルの意味を理解する必要があります。 mdf は CD/DVD イメージ ファイルの拡張子で、mds ファイルは mdf ファイルのメタデータ ファイルです。

CrystalDiskmarkとはどのようなソフトウェアですか? -crystaldiskmarkの使い方は? CrystalDiskmarkとはどのようなソフトウェアですか? -crystaldiskmarkの使い方は? Mar 18, 2024 pm 02:58 PM

CrystalDiskMark は、シーケンシャルおよびランダムの読み取り/書き込み速度を迅速に測定する、ハード ドライブ用の小型 HDD ベンチマーク ツールです。次に、編集者が CrystalDiskMark と Crystaldiskmark の使用方法を紹介します。 1. CrystalDiskMark の概要 CrystalDiskMark は、機械式ハード ドライブとソリッド ステート ドライブ (SSD) の読み取りおよび書き込み速度とパフォーマンスを評価するために広く使用されているディスク パフォーマンス テスト ツールです。 ). ランダム I/O パフォーマンス。これは無料の Windows アプリケーションで、使いやすいインターフェイスとハード ドライブのパフォーマンスのさまざまな側面を評価するためのさまざまなテスト モードを提供し、ハードウェアのレビューで広く使用されています。

foob​​ar2000のダウンロード方法は? -foobar2000の使い方 foob​​ar2000のダウンロード方法は? -foobar2000の使い方 Mar 18, 2024 am 10:58 AM

foob​​ar2000 は、音楽リソースをいつでも聴くことができるソフトウェアです。あらゆる種類の音楽をロスレス音質で提供します。音楽プレーヤーの強化版により、より包括的で快適な音楽体験を得ることができます。その設計コンセプトは、高度なオーディオをコンピュータ上で再生可能 デバイスを携帯電話に移植し、より便利で効率的な音楽再生体験を提供 シンプルでわかりやすく、使いやすいインターフェースデザイン 過度な装飾や煩雑な操作を排除したミニマルなデザインスタイルを採用また、さまざまなスキンとテーマをサポートし、自分の好みに合わせて設定をカスタマイズし、複数のオーディオ形式の再生をサポートする専用の音楽プレーヤーを作成します。過度の音量による聴覚障害を避けるために、自分の聴覚の状態に合わせて調整してください。次は私がお手伝いさせてください

NetEase メールボックス マスターの使用方法 NetEase メールボックス マスターの使用方法 Mar 27, 2024 pm 05:32 PM

NetEase Mailbox は、中国のネットユーザーに広く使用されている電子メール アドレスとして、その安定した効率的なサービスで常にユーザーの信頼を獲得してきました。 NetEase Mailbox Master は、携帯電話ユーザー向けに特別に作成された電子メール ソフトウェアで、電子メールの送受信プロセスが大幅に簡素化され、電子メールの処理がより便利になります。 NetEase Mailbox Master の使い方と具体的な機能について、以下ではこのサイトの編集者が詳しく紹介しますので、お役に立てれば幸いです。まず、モバイル アプリ ストアで NetEase Mailbox Master アプリを検索してダウンロードします。 App Store または Baidu Mobile Assistant で「Ne​​tEase Mailbox Master」を検索し、画面の指示に従ってインストールします。ダウンロードとインストールが完了したら、NetEase の電子メール アカウントを開いてログインします。ログイン インターフェイスは次のとおりです。

Baidu Netdisk アプリの使用方法 Baidu Netdisk アプリの使用方法 Mar 27, 2024 pm 06:46 PM

クラウド ストレージは今日、私たちの日常生活や仕事に欠かせない部分になっています。中国有数のクラウド ストレージ サービスの 1 つである Baidu Netdisk は、強力なストレージ機能、効率的な伝送速度、便利な操作体験により多くのユーザーの支持を得ています。また、重要なファイルのバックアップ、情報の共有、オンラインでのビデオの視聴、または音楽の聴きたい場合でも、Baidu Cloud Disk はニーズを満たすことができます。しかし、Baidu Netdisk アプリの具体的な使用方法を理解していないユーザーも多いため、このチュートリアルでは Baidu Netdisk アプリの使用方法を詳しく紹介します。まだ混乱しているユーザーは、この記事に従って詳細を学ぶことができます。 Baidu Cloud Network Disk の使用方法: 1. インストール まず、Baidu Cloud ソフトウェアをダウンロードしてインストールするときに、カスタム インストール オプションを選択してください。

BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? Apr 26, 2024 am 09:40 AM

MetaMask (中国語ではリトル フォックス ウォレットとも呼ばれます) は、無料で評判の高い暗号化ウォレット ソフトウェアです。現在、BTCC は MetaMask ウォレットへのバインドをサポートしており、バインド後は MetaMask ウォレットを使用してすぐにログイン、値の保存、コインの購入などが可能になり、初回バインドで 20 USDT のトライアル ボーナスも獲得できます。 BTCCMetaMask ウォレットのチュートリアルでは、MetaMask の登録方法と使用方法、および BTCC で Little Fox ウォレットをバインドして使用する方法を詳しく紹介します。メタマスクウォレットとは何ですか? 3,000 万人を超えるユーザーを抱える MetaMask Little Fox ウォレットは、現在最も人気のある暗号通貨ウォレットの 1 つです。無料で使用でき、拡張機能としてネットワーク上にインストールできます。

Xiaoai スピーカーの使用方法 Xiaoai スピーカーを携帯電話に接続する方法 Xiaoai スピーカーの使用方法 Xiaoai スピーカーを携帯電話に接続する方法 Feb 22, 2024 pm 05:19 PM

スピーカーの再生ボタンを長押し後、ソフトウェア内でWi-Fiに接続すると使用可能になります。チュートリアル 該当するモデル: Xiaomi 12 システム: EMUI11.0 バージョン: Xiaoai Classmate 2.4.21 分析 1 まずスピーカーの再生ボタンを見つけ、長押ししてネットワーク配信モードに入ります。 2 携帯電話の Xiaoai Speaker ソフトウェアで Xiaomi アカウントにログインし、クリックして新しい Xiaoai Speaker を追加します。 3. Wi-Fi の名前とパスワードを入力した後、Xiao Ai に電話して使用することができます。補足: Xiaoai Speakerにはどのような機能がありますか? 1 Xiaoai Speakerには、システム機能、ソーシャル機能、エンターテイメント機能、ナレッジ機能、ライフ機能、スマートホーム、トレーニングプランがあります。概要/注意事項: 簡単に接続して使用するには、Xiao Ai アプリを事前に携帯電話にインストールしておく必要があります。

iOS 17.4の新しい高度な機能「盗難デバイス保護」の使い方を教えます iOS 17.4の新しい高度な機能「盗難デバイス保護」の使い方を教えます Mar 10, 2024 pm 04:34 PM

Appleは火曜日にiOS 17.4アップデートを公開し、iPhoneに多数の新機能と修正をもたらした。このアップデートには新しい絵文字が含まれており、EU ユーザーは他のアプリ ストアから絵文字をダウンロードすることもできます。さらに、このアップデートでは iPhone のセキュリティ制御も強化され、より多くの「盗難デバイス保護」設定オプションが導入され、ユーザーにより多くの選択肢と保護が提供されます。 「iOS17.3では、「盗難デバイス保護」機能が初めて導入され、ユーザーの機密情報のセキュリティが強化されています。ユーザーが自宅やその他の身近な場所から離れている場合、この機能ではユーザーは最初に生体認証情報を入力する必要がありますApple ID パスワードの変更や盗難デバイス保護の無効化など、特定のデータにアクセスして変更するには、情報を再度入力する必要があります。

See all articles