在處理整形數值時,可以直接對組成整形數值的各個位進行操作。這意味着可以使用屏蔽技術獲得整數中的各個位
包括:&(與)、|(或)、^(異或)、~(非/取反)(與:兩個數都為1結果為1,或:兩個數有一個為1結果為1,異或:二者不同時結果為1異或,可以理解為不進位加法:1+1=0,0+0=0,1+0=1
性質:
1、交換律可任意交換運算因子的位置,結果不變
2、結合律(即(a^b)Ac==a^(bAc))
3、對於任何數x,都有xQx=0,x0=x,同自己求異或為0,同0求異或為自己
4、自反性AABAB=AA0=A,連續和同一個因子做異或運算,最終結果為自己)
2.>>和<<運算符將二進制位進行右移或者左移操作
3.>>>運算符將用0填充高位;>>運算符用符號位填充高位,沒有<<<運算符
對於int型,1<<35與1<<3是相同的(int型只有位AND: both are 1 and the result is 1, or: one is 1 and the result is 1, XOR: the result is 1 when the two are not the same),而左邊的操作數是long型時需對右側操作數模64
用法示例:
判斷奇偶數
>獲取二進制位是1還是0(兩種解決方案)
交換兩個整數變量的值
>不用判斷語句,求整數的絕對值
package 算法.位運算;
//題目:請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。
//例:9的二進制表示為1001,有2位是1
//思路:1.將數逐位左移,並與1進行與運算,並將結果為零的數進行次數統計
//2.每次消去最低位的一
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N =sc.nextInt();
System.out.println(Integer.toString(N,2));
//Integer與int區別https://blog.csdn.net/teacher_lee_zzsxt/article/details/79230501
int count=0;
for(int i=0;i<32;i++){
if((N&(1<<i))==(1<<i)){
count++;
}
}
System.out.println(count);
//方法二:
count = 0;
while(N!=0){
N=((N-1)&N);
count++;
}
System.out.println(count);
}
}
package 算法.位運算;
//題目:用一條語句判斷一個整數是不是二的整數次方
//思路:將這個整數轉換為二進制,假如這個數是二的整數次方,那么這個數只有最左邊是一
//其他的位置都是零。
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N =sc.nextInt();
System.out.println(Integer.toString(N,2));//將N轉化為二進制數
if(((N-1)&N)==0){
System.out.println("這個整數是二的整數次方");
}
else
System.out.println("這個整數不是二的整數次方");
}
}
package 算法.位運算;
//題目:將二進制數的奇偶位互換
//思路:1.將整數分別與0101010101....和1010101010....做與運算,可以分別保留
//奇數位和偶數位。然后將保留的奇數左移一位,將保留的偶數右移一位,就能得到轉換后的數。
//2.常規的解法可以將輸入的數轉換為數組,然后將數組中奇偶數位互換
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println("原來的數是:"+N);
int M=transform(N);
System.out.println("轉換后的數是的數是:"+M);
}
public static int transform(int i){
int even = i&0xaaaaaaaa;//和10101010....做與運算提取偶數位
//這里為了方便使用了16進制的八個a.
int odd = i&0x55555555;//和0101010101....做與運算提取奇數位
return(even>>1)^(odd<<1);
}
}
package 算法.位運算;
//題目:給定一個介於0和1之間的實數,(如0.625),類型為double,打印它的二進制表示(0.101,因為小數點后的二進制分別表示0.5,0.25.0.125......)。
//如果該數字無法精確地用32位以內的二進制表示,則打印“ERR OR”
//思路:
public class test4 {
public static void main(String[] args) {
double num = 0.5;
StringBuilder sb = new StringBuilder("0.");
while(num>0){
//乘二:挪整
double r = num*2;
//判斷整數部分
if(r>1){
sb.append("1");
//消掉整數部分
num=r-1;
}else{
sb.append("0");
num=r;
}
if(sb.length()>34){
System.out.println("ERROR");
return;
}
}
System.out.println(sb.toString());
}
}