位运算技巧
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)
反向器 | 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 |
?
文章来源:https://blog.csdn.net/qq_41566366/article/details/135004348
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!