位运算技巧

2023-12-14 23:12:09

获取某个10进制数值的二进制最高位

public class Main {
    public static void main(String[] args) {
        // 调用 highBit 函数,传入参数 67
        int result = highBit(67);
        // 输出结果的二进制表示
        System.out.println(Integer.toBinaryString(result));  // 输出 1000000
    }

    /**
     * 找到整数中最高位的1所在的位置
     * @param x 输入的整数
     * @return 最高位的1所在的位置
     */
    public static int highBit(int x) {
        // 输出输入整数的二进制表示
        System.out.println(Integer.toBinaryString(x));  // 输出 1000011
        // 1000011 | 0100001 => 1100011  从左到右第二位补1
        x = x | (x >> 1);
        // 输出经过第一次位运算后的结果
        System.out.println(Integer.toBinaryString(x));  // 输出 1100011
        // 1100011 | 0011000 => 1111011  从左到右第三、四位补1
        x = x | (x >> 2);
        // 输出经过第二次位运算后的结果
        System.out.println(Integer.toBinaryString(x));  // 输出 1111011
        // 1111011 | 0000111 => 1111111  从左到右第五、第六、第七位补零
        x = x | (x >> 4);
        // 输出经过第三次位运算后的结果
        System.out.println(Integer.toBinaryString(x));  // 输出 1111111
        // 1111111 | 0000000 => 1111111  从左到右第八、第九、第十、第十一、第十二、第十三、第十四、第十五位补零
        x = x | (x >> 8);
        // 输出经过第四次位运算后的结果
        System.out.println(Integer.toBinaryString(x));  // 输出 1111111
        // 1111111 | 0000000 => 1111111  从左到右第十六、第十七、第十八、第十九、第二十、第二十一、第二十二、第二十三、第二十四、第二十五、第二十六、第二十七、第二十八、第二十九、第三十位补零
        x = x | (x >> 16);
        // 输出经过第五次位运算后的结果
        System.out.println(Integer.toBinaryString(x));  // 输出 1111111
        // (1111111 + 1) >> 1 => 10000000 >> 1 => 1000000  =>  64
        return (x + 1) >> 1;
    }
}

判断值x是否包含值y,其中y是2的n次方

m & n == n

如果为true,则包含,否则不包含

反向器 (NOT Gate)

反向器01
输出10

与门 (AND Gate)

与门01
000
101

与非门

与非门01
011
110

或门

或门01
001
111

或非门

或非门01
010
100

异或门

异或门01
001
110

?

文章来源:https://blog.csdn.net/qq_41566366/article/details/135004348
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。