位運算-查找數組中唯一成對的數

基礎實例一使用位運算判斷數的奇偶性

  實例代碼:

public class Test {public static void main(String[] args) {System.out.println(isOdd(49));System.out.println(isOdd(50));}//  與運算public static boolean isOdd(int i){return (i & 1) != 0;   // 奇數最后一位二進制為 1,偶數最后一位二進制為 0}
}

基礎實例二:位運算判斷一個數轉為二進制后的第i位數是0還是1

  實例代碼:

public class Test {public static void main(String[] args) {
        // 與運算  int x = 85;System.out.println("x的第五位二進制位的數為:" + ((((x&(1<<4))>>4)==1)?"1":"0"));// 比如85的二進制為1010101,我們將它的二進制與1向左移4位來做與運算// 就是 1010101 & 0010000 得出結果0010000 再右移4位 即可得出結果} }

基礎實例三:位運算交換兩個整數變量的值

  實例代碼:

public class Test {// 異或運算public static void main(String args[]){int a=10;int b=20;a=a^b;b=b^a;a=a^b;System.out.println(a+"\t"+b);// 異或運算性質 x ^ x ^ y == y,因為x ^ x == 0,0 ^ y == y}
}

基礎實例四:使用位運算,不用判斷語句,求整數的絕對值

  實例代碼: 

public class Test {// 異或運算public static void main(String args[]){System.out.println(my_abs(-53));System.out.println(my_abs(53));}public static int my_abs(int a){/*** 對一個數進行位運算,是在這個數的補碼上運行的* 正數的補碼是原碼,負數的補碼為原碼除了最高的符號為,取反,然后加一* int 型,先右移31位取符號位 如果a位正數,i=0;a為負數,i=-1* 一個數與-1即與0xFFFFFFFF異或就相當與取反* 因此,a與i異或后再減i(因為i為0或-1,所以減i即是要么加0要么加1)也可以得到絕對值*/int i = a >> 31;return ((a ^ i) -i);}
}

異或運算特點:

  

題目一:找出唯一成對的數

  1-1000這1000個數放在含有1001個元素的數組中,只有唯一的一個元素值重復,其他均只出現一次。每個數組元素只能訪問一次,設計一個算法,將它找出來;不用輔助存儲空間,能否設計一個算法實現?

  解題思路:這里使用的原理是連續的數字異或可以消除重復,A ^ A=0,( A ^ A ) ^ B ^ ( C ^ C ) =B,但是我們的題目有兩個元素重復,假如使用一次異或那么這個重復的元素就會被消掉了。所以這里有一個小技巧,就是使用兩次異或,先對不包含重復值數組進行異或,在對包含重復值的數組進行異或,這樣下來,就相當于除了重復值每個值都異或了兩次,而重復的值異或了三次,這樣異或下來,就只剩一個重復的值了,就成功找出來了。為了方便測試,這里只使用了11個元素的數組,自行改成1001即可(示例代碼也給出了使用輔助存儲空間的解法)。這里有一個特殊的點,就是這里給出了數組是1-1000連續的數并且只有唯一一個元素值重復,所以才能構造進行異或兩次的解法。

  實例代碼:

import java.util.Random;public class 唯一成對的數 {public static void main(String[] args) {int N = 11;int [] arr = new int[N];for (int i = 0; i < arr.length-1; i++) {arr[i] = i+1;}// 最后一個數,是隨機數arr[arr.length-1] = new Random().nextInt(N-1)+1;// 隨機下標int index = new Random().nextInt(N);swap(arr, index, arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+ "  ");}System.out.println();int x1=0;for(int i=1;i <= N -1;i++){x1 = (x1^i);   // 求得1到N-1這些連續的數的異或}for(int i=0;i < N ;i++){x1 = (x1^arr[i]);  // 再與原來的數組arr異或,這樣重復的數就有三個,不重復的數有兩個,異或消除重復后,剩下的就是重復的數了}System.out.println(x1);System.out.println("使用輔助空間實現============");int []helper = new int[N];for (int i = 0; i < helper.length; i++) {helper[arr[i]]++;}for (int i = 0; i < helper.length; i++) {if (helper[i]==2) {System.out.println(i);break;}}}public static void swap(int[] array,int x,int y){int xx = array[x];int yy = array[y];array[x] = yy;array[y] = xx;}}

  運行結果:

    

題目二:找出落單的那個數

  一個數組里除了某一個數字之外,其他的數字都出現了兩次。請寫出程序找出這個只出現一次的數字。

  解題思路:這個題目經過上一個題目的學習,就很簡單了,直接進行異或即可。

  實例代碼:

public class Test {// 異或運算public static void main(String args[]){int []a = {1,1,2,2,3,4,3};int x1 = 0;for (int i = 0; i < a.length; i++) {x1 = x1 ^ a[i];}System.out.println(x1);}
}

  

?

  

?

轉載于:https://www.cnblogs.com/xiaoyh/p/10247283.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker實踐:Cannot connect to the Docker daemon.

Docker實踐&#xff1a;Cannot connect to the Docker daemon.查看docker daemon是否在運行 [rootlocalhost openec]# ps aux | grep dockerroot 3030 0.0 0.0 112656 984 pts/0 S 16:20 0:00 grep --colorauto docker啟動docker[rootlocalhost openec]# ser…

linux虛擬終端時間短,使用Screen創建虛擬終端避免Linux遠程斷線

維護Linux的ssh工具在使用中&#xff0c;一旦遇到網絡中斷&#xff0c;則當前的shell就會自動關閉當前的工作進度就會丟失&#xff0c;這對于遠程升級等比較耗費時間的工作是非常不利的對于遠程調適代碼也是很不可靠不安全的為此&#xff0c;可以使用screen這個工具來解決這個問…

中國第一軟件開發_我第一次開發企業軟件中學到的知識

中國第一軟件開發In this article, I’ll share ten lessons I learned from my first project as a self-taught software developer. I was working for a consulting company at the time, and my official title was Software Engineer. The project I worked on was a web…

react-native-Cocoapods-Swift-Project

https://reactnative.cn/docs/integration-with-existing-apps/ 1、創建一個xcode工程&#xff0c;single View就行&#xff0c;項目語言選擇swift&#xff0c;oc的直接生成就行不用這么麻煩。 2、把跟目錄上創建 node的package.json,執行命令 npm init npm install react-nati…

用shell或者python寫出各種圖形

首先是shell等邊三角形[roothxy my_script]# sh ff.sh num:6************************* *********** [roothxy my_script]# cat ff.sh #!/bin/bash ######################################################################### # File Name: ff.sh # Author: huxianyong # mai…

cfdiv2/c/找規律

題目連接 £&#xff1a;若n<4&#xff0c;NO&#xff1b; £&#xff1a;若n4,特判&#xff0c;n5&#xff0c;特判。 £&#xff1a;若n>6,用2-4組成24&#xff0c;1和5和6組成零&#xff0c;即可。 #include <set> #include <map> #includ…

linux lcd顯示流程,求助 armlinux中實現lcd顯示

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓/* for (bufIdx0; bufIdx < NUM_DISPLAY_BUFS-1; bufIdx) {fbp[bufIdx1] fbp[bufIdx] displaySize;}*/for(bufIdx0;bufIdx{buf(unsigned int *)fbp;for (i0; i < displaySize / sizeof(unsigned int); i) {buf[i] UYVY_BL…

android引入開源庫_為好目錄引入開源:通過代碼幫助公益組織

android引入開源庫by Michael D. Johnson邁克爾約翰遜(Michael D.Johnson) 為好目錄引入開源&#xff1a;通過代碼幫助公益組織 (Introducing the Open Source for Good Directory: Help Nonprofits with Code) A few months ago, we asked 20,000 people why they were learn…

第二階段站立會議08

站立會議內容&#xff1a; 大家準備繼續將代碼進行融合&#xff0c;進行測試對一些功能進行優化。 1、會議照片&#xff1a; 2、任務展板&#xff1a; 3、燃盡圖&#xff1a; 轉載于:https://www.cnblogs.com/smcoder/p/7002539.html

ionic view 視圖

ionic view 方法 $ionicView.loaded視圖已經被加載了。這事件只發生一次當視圖被創建并添加到Dom中。當跳出頁面并且被緩存了的話&#xff0c;再次訪問這個頁面時這個時間將不會被激活。Loaded事件是個好方式讓你為這個視圖設置你的代碼&#xff1b; 然而&#xff0c;他并不是…

ios開發 mvp實踐_實踐中開發人員的工作流程-我們如何在30天內建立??MVP

ios開發 mvp實踐by Lna Faure萊娜福雷(LnaFaure) 實踐中開發人員的工作流程-我們如何在30天內建立??MVP (The developer’s workflow in practice — how we built our MVP in 30 days) As a web developer, I often get to start projects from scratch and make decisions…

linux智能電壓表設計與實現,畢業論文 智能數字電壓表設計.doc

畢業論文畢業論文智能數字電壓表設計智能數字電壓表設計- PAGE I -摘要隨著微電子技術和計算機技術的迅速發展&#xff0c;特別是單片機的出現和發展&#xff0c;使傳統的電子測量儀器在原理、功能、精度及自動化水平等方面發生了巨大的變化&#xff0c;形成一種新一代的測量儀…

git——學習筆記(三)分支管理

一、創建、合并分支 每次提交&#xff0c;git都往后走一格&#xff0c;串成一跳時間線&#xff0c;head指向的是分支&#xff0c;分支指向提交。master是主分支&#xff0c;dev是另一條分支&#xff0c;分支就像指針一樣&#xff0c;合并、刪除分支時&#xff0c;修改的都是指針…

Redis 它是什么?它用來做什么?它的優勢與短板如何?

閱讀目的&#xff1a; 對什么是內存型數據庫有概念性的認知。?Redis 是什么&#xff1f; 通常而言目前的數據庫分類有幾種&#xff0c;包括 SQL/NSQL,&#xff0c;關系數據庫&#xff0c;鍵值數據庫等等 等&#xff0c;分類的標準也不以&#xff0c;Redis本質上也是一種鍵值…

阿里巴巴是如何打通 CMDB,實現就近訪問的?

CMDB在企業中&#xff0c;一般用于存放與機器設備、應用、服務等相關的元數據。當企業的機器及應用達到一定規模后就需要這樣一個系統來存儲和管理它們的元數據。有一些廣泛使用的屬性&#xff0c;例如機器的IP、主機名、機房、應用、region等&#xff0c;這些數據一般會在機器…

我們分析了成千上萬的編程訪談。 這就是我們學到的東西。

by Aline Lerner通過艾琳勒納(Aline Lerner) 我們分析了成千上萬的編程訪談。 這就是我們學到的東西。 (We analyzed thousands of coding interviews. Here’s what we learned.) Note: I wrote most of the words in this post, but the legendary Dave Holtz did the heavy…

Java 9 新功能之 HTTP2 和 REPL

對Java 9的炒作將不再局限于模塊化&#xff08;modularity&#xff09;&#xff0c;Java 9正在搜羅大量額外的功能模塊&#xff0c;這些功能模塊正作為Java增強提案&#xff08;JEP&#xff09;提交&#xff0c;并在OpenJDK (Java SE的參考實現項目&#xff09;中實現。 在這篇…

c語言編譯程序首要工作,c語言試卷

c語言試卷一、選擇題(每小題1分&#xff0c;共40分)。(以下A、B、C、D四個選項中只有一個是正確的。)1&#xff0e;一個C語言程序是由()。A&#xff0e;一個主程序和若干子程序組成B&#xff0e;函數C&#xff0e;若干過程組成D&#xff0e;若干子程序組成2&#xff0e;C語言源…

Mac通過wifi連接 Android設備

公司用的全是mac開發&#xff0c;但是全是type-C接口&#xff0c;每次背電腦回家啊&#xff0c;還得帶個數據線轉換器…… 想著回來&#xff0c;直接通過Wi-Fi連接手機就好&#xff0c;發現完全忘了之前套路&#xff0c;現在趕緊記下一波&#xff0c;保證包教包會&#xff01; …

貝葉斯統計推斷_統計推斷對決:頻繁主義者與貝葉斯主義者

貝葉斯統計推斷by Kirill Dubovikov通過基里爾杜博維科夫(Kirill Dubovikov) 統計推斷對決&#xff1a;頻繁主義者與貝葉斯主義者 (Statistical Inference Showdown: The Frequentists VS The Bayesians) 推理 (Inference) Statistical Inference is a very important topic t…