java按位操作

前几天看源码.看到一个数字 x |= ( x >> 1),当时一脸懵逼,完全不知道这个符号"|="什么意思,就想去查一下.结果看别的给忘记啦…今天打开Eclipes 想整理一下写过的乱七八糟的Demo代码,忽然又看到了,就把心得写下来吧

按位操作

与& 两个2进制位,都是1时,结果为1,否则为0,比如 8 & 9,8=1000,9=1001;结果为1000,就是8;如果8 & 7,就是1000 & 0111,结果是0;

或| 两个2进制位,有一个为1,则结果为1,否则为0;比如8 | 9,结果为1001,就是9;如果8 | 7,则是1000 | 0111,结果是1111,就是15;

异或^ 两个2进制位,相同则为0,不同则为1;同样8 ^ 9,1000 ^ 1001;则除了最低位,其他全部相同,结果为1;而8 ^ 7则是 1000 ^ 0111,因为全部都不同,所以是15

非!(取反) 不常用,一个2进制数字,是1的位取反记做0,是0的位取反记做1;

8转为2进制是0000…1000(int是32位,最高位0表示正数,中间省略24位0) 全部取反,则是1111…0111(中间省略24位1), 则是-9;(这个有点难以理解,不常用)

可以用 Integer.toBinaryString(-9) 将一个数字转为2进制查看;最大的负数,-1,用2进制表示则全部32位都是1;

	public static void main(String[] args) {
		// 8取反是-9
   	System.out.println(Integer.toBinaryString(~8));
   	// int型的-9转为2进制是 1111 1111 1111 1111 1111 1111 1111 0111
   	// 和我们上面说的一样,如果将-9转为long类型,则前面60位都是1;需要用Long.toBinaryString(-9)
   	System.out.println(Integer.toBinaryString(-9));
   	
   	// 与 和 或,异或 都比较容易理解,就不做演示了
   	// 这时候,x |= x >> 1;就能理解了,意思就是
   	int i = 5; // i可以是(5-7)
   	i |= ( i >> 1 );
   	// 发现了吗,大于4小于8的数字经过这个计算,都是7,然后+1就是8;
   	// 我把源码的内容复制了过来,并赋值,发现在不考虑溢出的情况下,经过下面的方式
   	i |= (i >> 1);
   	i |= (i >> 2);
   	i |= (i >> 4);
   	i |= (i >> 8);
   	i |= (i >> 16);
   	i++;
   	// 总能得到2的n次幂;而且是最近的;但是有个意外,当输入8的时候,得到的是16,16的时候得到32;
   	// 我就很想不通,我本来期望的是,输入8,得到8,输入9,得到16;然后我就继续去查资料;
   	// 发现有个办法可以解决这个问题,就是在进入 |= 运算之前,先 -1,就一定是正确的结果;
   	
   	// 到了这里基本就说完了,可是我依然有个疑惑,jdk的开发者不可能没发现这个问题,为什么还是这样写呢?也可能是我不理解作者原意吧;
   	// 源码:ArrayDeque 第122行-139行
     // 仔细看了看,好像没有什么地方说错,,如果有说错了请留言提醒
   }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值