開發中總是存在着各種狀態的保持。都是字段的話,相當麻煩。使用二進制狀態存儲就方便多了。現在一個int值你可以保存32個開關了。
10111 = 2^4+2^2+2^1+2^0=16+4+2+1=23 第1個開關(10111右邊第1位) 23&2^(1-1)=23&1=1 二進制是1 位運算 1>>(1-1)=1 表示開 第2個開關(10111右邊第2位) 23&2^(2-1)=23&2=2 二進制是10 位運算 2>>(2-1)=1 表示開 第3個開關(10111右邊第3位) 23&2^(3-1)=23&4=4 二進制是100 位運算 4>>(3-1)=1 表示開 第4個開關(10111右邊第4位) 23&2^(4-1)=23&8=0 二進制是0 表示關閉 第5個開關(10111右邊第5位) 23&2^(5-1)=23&16=16 二進制是10000 位運算 16>>(5-1)=1 表示開 。。。 第n個開關(10111右邊第n位) 23&2^(n-1)=a 二進制是? 位運算 a>>(n-1)=1 表示X |
package com.yh.tools.binarySwitch;
/**
* @Description: 使用一個int的二進制形式表示最多32個(32位)開關的狀態。10111從右向左是開開開關開,一共五位。10進制用23表示
* @CreateDate: 2018/8/2 14:31
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class BinarySwitch {
/**
* 查詢當前index狀態,[0,1];
* 查看index位置上的開關狀態 0=false 1=true
* @param value 存儲的開關數據int32
* @param index 第幾位
* @return 當前位置的值
*/
static boolean value_bit(int value, int index) {
return (value >> --index & 1) > 0;
}
/**
* 處理後的存儲數據 int32
*
* @param value 存儲的開關數據int32
* @param index 第幾位
* @param set 開關狀態
* @return 當前位置的值[0,1]
*/
static int value_bit(int value, int index, boolean set) {
index--;
if (set) {
value = 1 << index | value;
} else {
value = ~(1 << index) & value;
}
return value;
}
public static void main(String[] args) {
int data = 0;
data = BinarySwitch.value_bit(data, 1, true);
data = BinarySwitch.value_bit(data, 2, true);
data = BinarySwitch.value_bit(data, 3, true);
data = BinarySwitch.value_bit(data, 4, false);
data = BinarySwitch.value_bit(data, 5, true);
System.out.println("data:" + data + " data_bin:" + Integer.toBinaryString(data));
data = BinarySwitch.value_bit(data, 1, false);
data = BinarySwitch.value_bit(data, 3, false);
data = BinarySwitch.value_bit(data, 4, true);
System.out.println("data:" + data + " data_bin:" + Integer.toBinaryString(data));
System.out.println(BinarySwitch.value_bit(data, 1));
System.out.println(BinarySwitch.value_bit(data, 2));
System.out.println(BinarySwitch.value_bit(data, 3));
System.out.println(BinarySwitch.value_bit(data, 4));
System.out.println(BinarySwitch.value_bit(data, 5));
/** out :
data:23 data_bin:10111
data:26 data_bin:11010
false
true
false
true
true
*/
System.out.println(Integer.toBinaryString(64));
System.out.println(Integer.toBinaryString(32));
System.out.println(64&32);//0
}
}