获取某个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)
反向器 | 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 |
?