1. 程式人生 > >Java中異或運算實現兩個整數的交換以及其功能函式實現

Java中異或運算實現兩個整數的交換以及其功能函式實現

       今天學習到一種超酷炫的交換兩個整數的方法,給各位分享一下。異或運算屬於位運算的一種,首先簡單介紹一下異或預算的語法規則。

假設a與b為不相等的兩個整數。

(1)a^a=0;

(2)a^b=1;

(3)a^0=a;

(4)a^b=b^a,即異或滿足交換律。

(5)(a^b)^c=a^(b^c),即異或滿足結合律。

     接下來介紹一下異或運算實現兩個整數交換的原理,同樣假設a與b為兩個不相等的整數。

第一步:a=a^b。此時a=a^b;

第二步:b=a^b。因為上步a=a^b,所以此時b=a^b=(a^b)^b=a^(b^b)=a^0=a;

第三步:a=a^b。因為上步a=a^b,b=a,所以此時a=a^b=(a^b)^a=(b^a)^a=b^(a^a)=b^0=b。

<span style="font-size:18px;">public class Test1 {
public static void main(String[] args) {
	int a=5;
	int b=2;
	System.out.println("交換後:a="+a+", b="+b);
	a=a^b;
	b=a^b;
	a=a^b;
	System.out.println("交換後:a="+a+", b="+b);
}
}</span>

異或運算操作簡單,運算速度快,且不需要開闢額外的記憶體空間。是不是很酷炫呢?有時候為了編碼需要,我們要將這樣的功能封裝在一個函式體中,但如下所示的方法是不能實現兩個整數的交換的,只是交換了a和b的地址而已。

<span style="font-size:18px;">private void swap(int a,int b) {
	int t=a;
	a=b;
	b=t;
}</span>

java中沒有指標和引用的概念,我們沒有辦法像C那樣在函式體中通過傳遞引用來實現兩個整數的交換,那麼要怎麼做呢?我們可以藉助陣列來完成,陣列的索引相當於C中的指標。我們通過異或運算和建立臨時變數兩種方法來分別說明使用如何使用陣列來實現交換的功能函式。

<span style="font-size:18px;">public class Test2 {
public static void main(String[] args) {
	int a=5;
	int b=2;
	int []f=new int[2];
	f[0]=a;
	f[1]=b;
	System.out.println("交換後:a="+a+", b="+b);
	swapByBit(f);
	System.out.println("通過異或交換:a="+f[0]+", b="+f[1]);
	swapByTemp(f);
	System.out.println("通過臨時變數交換:a="+f[0]+", b="+f[1]);
}
private static void swapByBit(int []f) {
	f[0]=f[0]^f[1];
	f[1]=f[0]^f[1];
	f[0]=f[0]^f[1];
}
private static void swapByTemp(int []f) {
	int t=f[0];
	f[0]=f[1];
	f[1]=t;
}
}
</span>

相關推薦

Java運算實現整數交換及其功能函式實現

       今天學習到一種超酷炫的交換兩個整數的方法,給各位分享一下。異或運算屬於位運算的一種,首先簡單介紹一下異或預算的語法規則。 假設a與b為不相等的兩個整數。 (1)a^a=0; (2)a^b

[Java] 不使用第三變數實現整數型別變數互換(運算子)

在對變數進行互換時,通常的做法是建立一個臨時變數來共同完成互換,但臨時變數的建立增加了系統資源的消耗。 其實,如果需要交換的是兩個整數型別的變數,則可以使用異或運算子( ^ )進行互換。 imp

javadouble類型顯示小數,比如12.00

概念 format pan doc 而不是 興趣 compareto 就會 decimal Double類型的數據如何保留兩位小數? 各位大蝦,現有Double類型的數據,如何轉換為保留兩位小數的數,返回值的類型仍然是Double類型的,而不是字符串類型。 比如 0

C語言,實現整數m和n的二進位制序列有多少不同的位

新手學程式設計,大佬寫的太高深,看看本人小白寫的,一起學習一起交流 #include <stdio.h> int main() { int m = 0; int n = 0; int i = 0; int count = 0; scanf("%d%d", &

採用位方式將變數數值調換

1 package debug; 2 3 class Demo2 { 4 public static void main(String[] args){ 5 int a = 1; 6 int b = 2; 7 System.out.

采用位方式將變量數值調換

clas 兩個 rgs package 異或 dem int span [] 1 package debug; 2 3 class Demo2 { 4 public static void main(String[] args){ 5

java 一個等於號和等於號三等號的區別?

一個等號是賦值號,兩個等號是判斷號。賦值表示把右邊的值或引用賦給左邊的變數,判斷號表示返回符號兩邊的值是否相等,這裡的值包括引用。相等運算子"==",如果兩個運算元不是同一型別,則會先嚐試轉換型別在進行比較。嚴格相等運算子“==="首先計算其運算元的值,然後比較這兩個值,比較

php使用xor調換變數的值的原理

1、首先,我們要知道什麼是異或,異或,簡單來說就是:相同的兩個數,異或的結果是0;不同的兩個數,異或的結果是1。 2、0和0,異或的結果是0。1和1,異或的結果是0。0和1,異或的結果是1。於是我們發現,在0和1的世界裡:A和B異或,結果是C;B和C異或的結果

利用位運算實現整數的加法運算,請程式碼實現,並作簡要說明。

#include <stdio.h>      int main(void) {        int add(int a,int b);       int m,a,b;       scanf("%d,%d",&a,&b);       m

java版——實現數值交換的四種方式

實現兩個數值交換,最常用的莫過於中間變數法,那是不是還有別的方式呢。請看下文: class Operator { // 實現兩個數值交換的多種方式 public static void main(

利用位運算實現整數的加法運算

#include <stdio.h> int main(void) { int add(int a,int b); int m,a,b; scanf("%d,%d",&a,&b); m = add(a,b); printf("m=%

java)leetcode415 字串相加(整數儲存成字串的形式,對它們求和)(Add String)

題目描述: 給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和。 注意: num1 和num2 的長度都小於 5100. num1 和num2 都只包含數字 0-9. nu

實現整數變數交換的三種方式

第一種方式(推薦) int temp; temp = x; x = y; y = temp; 第二種方式: 有弊端,有可能會超出int的取值範圍 x = x + y; y = x - y;

實現資料交換的演算法實現

1,用記憶體交換的方式寫一個交換兩個資料的巨集 #define <stdio.h> #include <string.h> #define swap(a, b) \ { char tempBuff[10]; memcmp(tempB

(位運算子)請自己實現整數變數的交換 ^的特點 (面試題)

int a=10;int b=20;//方式1:借用第三方變數int c;c=a;a=b;b=c;System.out.println("a:"+a+":"+"b:"+b);//方式2:使用位異或實現a=a^b;b=a^b;a=a^b;System.out.println("a:"+a+":"+"b:"+b)

整數交換

  本文轉載自網際網路,如有侵權,請聯絡我及時刪除。謝謝。 第一個程式設計題是:用 C 語言寫一個函式交換兩整數的值,不借助第三個變數。 事實上這個題目一聽到就有了想法,因為以前有做過,形如: (方法一:) a = a + b; b = a - b; a =

寫一個函式,求整數之和,要求在函式體內不得使用+、-、*、/四則運算子號

思路:首先看十進位制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算進位,得到2。第二步:計算進位值,得到10. 如果這一步的進位值為0,那麼第一步得到的值就是最終結果。第三步:重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。同樣我們可以用三

編寫求整數最大公約數的函式,並呼叫此函式整數的最大公約數? 呼叫函式

#include <stdio.h> int GCD(int a,int b); int main() {     int num1 = 0 ,num2 = 0;     int result ;     printf("輸入兩個整數:\n");     sc

題目:寫一個函式,求整數之和,要求在函式體內不得適用+,-,* ,./ 四則運算子號

題目:寫一個函式,求兩個整數之和,要求在函式體內不得適用+,-,* ,./  四則運算子號     面試的時候被問道這個問題,首先我們分析人們是如何進行十進位制的加法的,比如如何得出5+17=22這個結果的,實際上,我們可以分三步進行:第一步只做各位相加不進

運算實現變數互換

        一般情況下,如果我們要實現兩個變數互換需要藉助於一個第三方臨時變數,這個臨時變數可以臨時存放某一個變數的值,幫助我們完成值的交換。有沒有不需要其他變數、直接實現值互換的方法呢?  答案是:當然有。     &n