layout: post title: “2019-02-24-今日技术简报” date: 2019-02-24 12:11:30 +0800

  1. ~ 表示按位取反

~200 = -201 ~-200 = 199

运算规则:如果位为0,结果是1,如果位为1,结果是0.

比如:~37

在Java中,所有数据的表示方法都是以补码的形式表示,8转为二进制是100101.

补码后为: 00000000 00000000 00000000 00100101

取反为: 11111111 11111111 11111111 11011010

因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。

因此,我们可将这个二进制数的补码进行还原: 首先,末尾减1得反码:11111111 11111111 11111111 11011001 其次,将各位取反得原码:

00000000 00000000 00000000 00100110,此时二进制转原码为38

所以~37 = -38.

  1. Java»与»>的区别

’»‘:带符号右移。正数右移高位补0,负数右移高位补1。比如:

4 » 1,结果是2;-4 » 1,结果是-2。-2 » 1,结果是-1。

’»>’:无符号右移。无论是正数还是负数,高位通通补0。

对于正数而言,»和»>没区别。

对于负数而言,-2 »> 1,结果是2147483647(Integer.MAX_VALUE),-1 »> 1,结果是2147483647(Integer.MAX_VALUE)。

以下代码可以判断两个数的符号是否相等

return ((a » 31) ^ (b » 31)) == 0;

  1. arraycopy(GrowingArrayUtils)

T[] newArray = (T[])((Object[])Array.newInstance(array.getClass().getComponentType(), growSize(currentSize)));

System.arraycopy(array, index, array, index + 1, currentSize - index);

将原数组的一部分拷贝到另外一个数组

  public class java_test {
      public static void main(String... args) {
        int before[] = {0, 2, 3, 0};
        int after[] = new int[4];
        System.arraycopy(before, 0, after, 0, 0);
        System.arraycopy(before, 1, after, 2, 2);
        after[1] = 1;
        for (int i = 0; i < after.length; i++) {
            System.out.println("i:" + i + " after value:" + after[i]);
        }
        System.arraycopy(before, 1, before, 2, 2);
        before[1] = 1;
        for (int i = 0; i < before.length; i++) {
            System.out.println("i:" + i + " before value:" + before[i]);
        }
      }
  }
  1. UnmodifiableList 只可以查看不可以更改的Array,常用来封装和重构

  2. RecyclerView 的getChildCount方法被改写. ```java public int getChildCount() { return this.mRecyclerView.mLayout.getChildCount(); }

```