java中的位运算符,位运算使用场景

  java中的位运算符,位运算使用场景

  如何解决写爬虫IP受阻的问题?立即使用。

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

  位运算主要包括移位运算和逻辑运算。下面分别说移位运算和逻辑运算。

  移位操作:

  左移:运算符为,左移,右边低位用0填充,左边高位丢弃,二进制视为整数。左移1位相当于乘以2。无符号右移:运算符为,右移,弃右,左加0。符号右移:运算符为,右移,右边的丢弃,左边的补码值取决于原来的最高位。如果是1,就补1,如果是0,就补0。二进制视为整数,右移一位相当于除以2。

  例如:

  int a=4;//100

  a=a ^ 2;//001,等于1

  A=a 3 //1000,对8的逻辑运算是:

  逐位and:只有当两位都是1时才是1。

  按bit或:只要有一位是1,就是1。

  按位反转~: 1变成0,0变成1

  按位异或:差为真,同为假。

  例如:

  int a=.

  A=a0x1 //返回0或1,是a最右边位的值。

  A=a 0x1 //不管A原来最右边的位是什么,都会设置为1。让我们看一些简单的应用场景:

  场景1:判断奇偶

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

  看看代码:

  int I=1;//二进制存储模式是00000000000000000000000000000000001

  int j=5;//二进制存储模式是00000000000000000000000000000000001

  int k=6;//二进制存储模式是000000000000000000000000000000000000110

  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等于它们依次一点一点反过来的结果。比如8-1=7,二进制数是111,可以用8的二进制数1000逐位反相得到。而87=0,提取规则是:

  (n(n-1))==0。符合这个规律的n是2的整数次方。

  (学习视频分享:java视频教程)

  场景3:简单的集合处理

  不废话,只看代码:

  public class SimpleSet { public static final int A=0x 01;//最后四位数是0001

  公共静态final int B=0x02//最后四位数是0010

  公共静态final int C=0x04//最后四位数是0100

  公共静态final int D=0x08//最后四位数是1000

  private int set=0x00//初始0000,空集合

  Public void add(int i) {//将I对应位的值设置为1。重复添加不影响。传入的默认值是ABCD之一,这里省略边界判断。

  set =I;

  } public boolean contain(int i) {//判断对应位置是否为1。

  return(set I)==I;

  } public boolean remove(int i) {//来不及解释。看看代码

  if(包含(i)) {

  set-=I;返回true

  } else {返回false

  }

  }

  }测试一下:

  公共静态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));

  }输出是:

  错误的

  错误的

  真实的

  真实的

  错误的

  错误的

  没错,没问题。

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

  对了,java中int的整数包装器类中有很多静态工具提供位操作,而且大部分都很复杂,有兴趣可以看看。

  结论:

  位运算是计算机最好的运算,在jdk源代码中被广泛使用。了解它有助于我们更深入地理解计算机,写出更优雅的代码。

  推荐:java入门。以上是java中bit操作的细节和应用场景。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: