当前位置: 代码迷 >> J2SE >> 关于【位运算】的有关问题
  详细解决方案

关于【位运算】的有关问题

热度:59   发布时间:2016-04-23 20:42:18.0
求助关于【位运算】的问题
最近在看java.nio包的源代码,其中,Buffer类中有这么个方法:

static void checkBounds(int off, int len, int size) { // package-private
        if ((off | len | (off + len) | (size - (off + len))) < 0)
    throw new IndexOutOfBoundsException();
    }
它用来检查数组是否越界,被子类如ByteBuffer的get、put方法调用:

public ByteBuffer get(byte[] dst, int offset, int length) {
checkBounds(offset, length, dst.length);
if (length > remaining())
    throw new BufferUnderflowException();
int end = offset + length;
for (int i = offset; i < end; i++)
    dst[i] = get();
return this;
    }

我的疑问是:checkBounds方法中,那个判断语句表达的是什么意思(位运算本身我已经做了了解),是off、len、(off + len)这几个表达式都大于0的意思吗?  求解惑

------解决方案--------------------
意思是只要有一个小于0条件成立,进入判断,抛出异常

只有当几个条件都大于0的时候,才会条件不成立,不进入判断不抛出异常
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

意思是只要有一个小于0条件成立,进入判断,抛出异常

只有当几个条件都大于0的时候,才会条件不成立,不进入判断不抛出异常


如果是这个意思的话,那么 “off + len”这个表达式是不是多余的呢?

off+len是防止下标溢出,是很关键的

如果off + len < 0 ,则off、len至少有一个为负数,就会先满足前面的条件了(off < 0 
------解决方案--------------------
 len < 0),所以我觉得这个条件是多余的

整数范围是-2^31 ~ 2^31-1,你觉得比如两个2^31-1相加,结果还会是正数码?
		int off = Integer.MAX_VALUE, len = Integer.MAX_VALUE;
System.out.println(off);
System.out.println(len);
System.out.println(off + len);

输出
2147483647
2147483647
-2
  相关解决方案