获取某个10进制数值的二进制最高位
public class Main {public static void main(String[] args) {// 调用 highBit 函数,传入参数 67int 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 从左到右第二位补1x = x | (x >> 1);// 输出经过第一次位运算后的结果System.out.println(Integer.toBinaryString(x)); // 输出 1100011// 1100011 | 0011000 => 1111011 从左到右第三、四位补1x = 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 => 64return (x + 1) >> 1;}
}
判断值x是否包含值y,其中y是2的n次方
m & n == n
如果为true,则包含,否则不包含
反向器 (NOT Gate)
反向器 | 0 | 1 |
---|---|---|
输出 | 1 | 0 |
与门 (AND Gate)
与门 | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
与非门
与非门 | 0 | 1 |
---|---|---|
0 | 1 | 1 |
1 | 1 | 0 |
或门
或门 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
或非门
或非门 | 0 | 1 |
---|---|---|
0 | 1 | 0 |
1 | 0 | 0 |
异或门
异或门 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |