文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中位运算的使用示例

2023-06-07 23:15

关注

这篇文章将为大家详细讲解有关java中位运算的使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我们知道程序中的所有数在计算机内存中都是以二进制的形式储存的,而位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。

位运算主要有移位运算和逻辑运算。下面我们就分别来讲讲移位运算和逻辑运算。

移位运算:

左移:操作符为<<,向左移动,右边的低位补0,左边高位舍弃,将二进制看做整数,左移1位就相当于乘以2。无符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补的值取决于原来最高位,原来是1就补1,原来是0就补0,将二进制看做整数,右移1位相当于除以2。

例如:

int a = 4; // 100a = a >> 2; // 001,等于1a = a << 3 // 1000,变为8

逻辑运算有:

例如:

int a = ...; a = a & 0x1 // 返回0或1,就是a最右边一位的值。a = a | 0x1 //不管a原来最右边一位是什么,都将设为1

我们来看几个简单的应用场景:

场景一:判断奇偶

分析:奇数都不是2的整数倍,转换成二进制后最低位必然为1,偶数则相反。利用这个特性我们可以很容易的通过位运算判断一个整数的奇偶性。

看代码:

   int i = 1;// 二进制存储方式为00000000000000000000000000000001    int j = 5;// 二进制存储方式为00000000000000000000000000000101    int k = 6;// 二进制存储方式为00000000000000000000000000000110    if ((i & j) == 1) {      System.out.println("j的最低位为1,为奇数");    }    if ((i & k) == 0) {      System.out.println("k的最低位为0,为偶数");    }

场景二:判断一个正整数是不是2的整数次幂

分析:我们先来看一下常见的2的整数次幂的数:2、4、8、16,转化成二进制依次为:10、100、1000、10000,发现规律了没有?那就是除了首位是1,其他全是0。恰巧这些数减去1后等于他们依次按位取反的结果,比如8-1=7,二进制是111,可以通过8的二进制1000按位取反得到。而8&7=0,提取一下规律就是:

(n&(n-1))==0

符合这个规律的n就是2的整数次幂了。

场景三:简单的集合处理

不废话,直接看代码:

public class SimpleSet {  public static final int A = 0x01;// 最后四位为0001  public static final int B = 0x02;// 最后四位为0010  public static final int C = 0x04;// 最后四位为0100  public static final int D = 0x08;// 最后四位为1000  private int set = 0x00;// 初始0000,空集合  public void add(int i) {// 将i对应位的值置为1,重复add不影响。默认传入值为ABCD之一,此处省去边界判断    set |= i;  }  public boolean contain(int i) {// 判断相应位置是否为1    return (set & i) == i;  }  public boolean remove(int i) {// 来不及不解释了快看代码    if (contain(i)) {      set -= i;      return true;    } else {      return false;    }  }}

测试一下:

 public static void main(String[] args) {    SimpleSet set = new SimpleSet();    System.out.println(set.contain(A));    set.add(B);    System.out.println(set.contain(A));    System.out.println(set.contain(B));    set.add(A);    set.add(C);    System.out.println(set.contain(A));    set.remove(A);    System.out.println(set.contain(A));    System.out.println(set.remove(A));    System.out.println(set.contain(C));  }

输出为:

falsefalsetruetruefalsefalsetrue

好的,没有问题。

大家可能会觉得,上面的示例代码中的A、B、C、D有点类似于枚举,事实上jdk源码中的关于枚举的集合类EnumSet使用的就是类似的方案,当然比这个复杂得多,有兴趣的可以去翻一下源码,这个方案它有个名字,叫位向量。

顺便提一句,java中int的包装类Integer里面有很多静态工具方提供位运算操作,且大都十分复杂,感兴趣的可以去看看

结语:

位运算是计算机最擅长的运算,jdk的源码中也大量地使用了它,搞明白它有助于我们更加深入的理解计算机,也有助于我们写出更优雅的代码。

关于“java中位运算的使用示例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯