研究表明 (Hayes,Bloom)在任何一种领域内,象下棋、作曲、绘画、钢琴演奏、游泳、网球、以及原子物理学和拓扑学,等等,要达到专家水平大约都要花十年时间。没有真正的捷径:即使是莫扎特,4岁时就是音乐神童,13年后才开始写出世界级的作品。在另一方面,披头士似乎在1964年的EdSullivan表演上一炮走红。但他们从1957年就开始表演,在获得大众青睐后,他们的第一个重大成功,Sgt.Peppers,是1967年发行的。Samuel Johnson (塞缪尔·约翰逊,英国辞典编纂家及作家)认为要花比十年更长的时间:“在任何领域中出类拔萃都要用毕生的劳作来取得;它不可能用较低的代价获得。” 而Chaucer(乔叟,英国诗人)感叹到:“人生短暂,学海无涯。”
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
上面是JDK工程师是这样写的,通过右移并对自己进行或运算,“把自己全部变成1”,然后再+1得到结果。 看完先默默膜拜个一秒钟。 自个儿的回顾了一下二进制,大概就是自问自答,自己考自己吧。 然后发现自己对于“ 怎么用位运算快速得到 int 区间的最大值和最小值 ”竟然回答不出来!
事发在昨天晚上,今天早上自己跟自己较劲了一整个上午时间,流水账一下总结: 因为 int 类 占4个字节,每个字节占8个bit位置。所以每个int都需要占用32个bit的空间。 最小当然是全部都是0,最大是全部都是1。 微笑脸,这是错的。 因为一开始的那一位是用来代表正负的(1代表负,0代表正数), 所以实际上可以用来存值只有31个bit的位置。 而每个bit有两个状态:1和0。所以 int 可以代表的范围: 开头第一个bit是0时(正数) 有 2个2个2…一共有31个2。即2的31次方。 开头第一个bit是1时(负数) 有 2个2个2…一共有31个2… 所以一共有2的31次方再乘2 也就是2的32次方。