JDK中的位操作
来源:互联网 发布:吴京男儿本色知乎 编辑:程序博客网 时间:2024/06/13 22:15
在看JDK某些类和方法时经常会看到这样的位操作源码,初看很费解,仔细想想才琢磨出了这样做的目的:
if (n >= MAX_ID) n = MAX_ID;//MAX_ID=0x7fff else { n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; }
这个操作其实是让一个大于MAX_ID的值直接等于MAXID,而让一个小于MAXID又大于等于0x4000的值经过这个位操作后也等于0x7fff这是怎么回事呢?为什么是0x4000呢?请看下面:
假如我们有一个16位的二进制数:
0100 0000 0000 0000 (0x4000)
我们对其进行上述的位操作,过程如下:
第一步 n |= n>>>1 (n无符号右移1位后或上n)
0100 0000 0000 0000 或
0010 0000 0000 0000
----------------------------- 等于
0110 0000 0000 0000
第二步 n |= n>>>2 (n无符号右移2位)
0110 0000 0000 0000 或
0001 1000 0000 0000
----------------------------- 等于
0111 1000 0000 0000
第三步 n |=n>>>4 (n无符号右移4位)
0111 1000 0000 0000 或
0000 0111 1000 0000
-----------------------------等于
0111 1111 1000 0000
第三步 n |=n>>>8 (n无符号右移8位)
0111 1111 1000 0000 或
0000 0000 0111 1111 (最低位1丢失)
-----------------------------等于
0111 1111 1111 1111
上面的这个数就是0x7fff
所以上面的位操作就是一个把任意16位的二进制数的第一位之后的位全置为1的操作:
如0000 0010 0000 0000 经过上述运算最后会等于 0000 0011 1111 1111
n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16;如果是以上操作的话,就是把任意一个32(16*2)位的二进制数的除最高位以外的位全置为1;
- JDK中的位操作
- .net中的位操作
- .net中的位操作
- C#中的位操作
- c#中的位操作
- C#中的位操作
- C#中的位操作
- sql中的位操作
- Java中的位操作
- sql中的位操作
- C#中的位操作
- c++中的位操作
- c#中的位操作
- c中的位操作
- C中的位操作
- C# 中的位操作
- C++ 中的位操作
- Java中的位操作
- 京东面试,问到我是否用过GridView,又回来脑补
- v9教你输出最后一次sql语句
- 范数与距离的关系
- xcode7的bug
- 仿银行号码的输入框
- JDK中的位操作
- 转 vc 中 定义全局变量
- [Git] fatal: protocol error: bad pack header
- uva 1637 - Double Patience
- automake,autoconf使用详解
- 大量的QT控件及示例发放
- 【20150912】NOIP模拟 题解 & 总结
- Android基础入门教程——2.4.10 Spinner(列表选项框)的基本使用
- Scala第三天作业