二進制開關理解和實現 轉

開發中總是存在着各種狀態的保持。都是字段的話,相當麻煩。使用二進制狀態存儲就方便多了。現在一個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

    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章