您的位置:首页 > 编程语言 > Java开发

java Integer源码阅读

2017-06-11 14:09 381 查看
参考博客 :

Java 源码学习系列(三)——Integer

求二进制数中1的个数

Java源码 Integer.bitCount实现过程

类定义

注意:源码是jdk1.7.0_79的

public final class Integer extends Number implements Comparable<Integer>


Integer 是 final 的不能被继承。

Integer 继承了 Number 抽象类。(转化成其他数值基本类型与byte类型)

Integer 实现了 Comparable 接口。(可以调用compareTo方法与Integer类型比较大小)

//最小值  补码
public static final int   MIN_VALUE = 0x80000000;
//最大值  正数和0补码与原码相同
public static final int   MAX_VALUE = 0x7fffffff;
//int.class
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");


构造函数:

//私有变量 final只能赋值一次 Integer所包装的int值
private final int value;

//构造函数 - 接收一个int类型值
public Integer(int value) {
this.value = value;
}
//构造函数 - 接收String解析成10进制int
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}


valueOf方法详解:

//如果i的值在 - 128 到 127(可配置)之间,取IntegerCache.cache中缓存的对象返回
//否则 new Integer(i)返回
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage.  The size of the cache
* may be controlled by the -XX:AutoBoxCacheMax=<size> option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
//静态内部类 存放 -128 - 127(默认)之间的缓存Integer对象
private static class IntegerCache {
static final int low = -128; //最小值
static final int high; //最大值,可配置
static final Integer cache[]; //缓存
//静态初始化
static {
// high value may be configured by property
//默认最大127
int h = 127;
//配置参数java.lang.Integer.IntegerCache.high可修改
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
//参数解析成int
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
//最大值范围 Integer.MAX_VALUE - 128 - 1 ;
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
}
high = h;
//创建cache,并对cache进行初始化
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
//私有构造函数,不能类外实例化,这个内部类不需要实例,只需要静态的存储数组cache
private IntegerCache() {}
}


注意: 当在代码中这样写 Integer i = 10 ; 这句编译成 Integer i = Integer.valueOf(10);

这时只要int值在cache范围中,会直接返回缓存的对象.

可以写一个简单的类测试下

public class Test {
public static void main(String[] args) {
Integer j = 10;
}
}


使用 javap工具进行反编译

可以看到Main方法里 先向操作数栈写入常量 10 ,调用Integer.valueOf方法来赋值

同样的Integer类型赋值给int反编译可以看到调用了intValue方法.

可以参考: 从Java代码到字节码(1)

Classfile /D:/test/Test.class
Last modified 2017-3-2; size 331 bytes
MD5 c
4000
hecksum 117f6bcda0214e440d161a207b99ccf3
Compiled from "Test.java"
public class Test
SourceFile: "Test.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER

Constant pool:
#1 = Methodref          #4.#13         //  java/lang/Object."<init>":()V
#2 = Methodref          #14.#15        //  java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
#3 = Class              #16            //  Test
#4 = Class              #17            //  java/lang/Object
#5 = Utf8               <init>
#6 = Utf8               ()V
#7 = Utf8               Code
#8 = Utf8               LineNumberTable
#9 = Utf8               main
#10 = Utf8               ([Ljava/lang/String;)V
#11 = Utf8               SourceFile
#12 = Utf8               Test.java
#13 = NameAndType        #5:#6          //  "<init>":()V
#14 = Class              #18            //  java/lang/Integer
#15 = NameAndType        #19:#20        //  valueOf:(I)Ljava/lang/Integer;
#16 = Utf8               Test
#17 = Utf8               java/lang/Object
#18 = Utf8               java/lang/Integer
#19 = Utf8               valueOf
#20 = Utf8               (I)Ljava/lang/Integer;
{
public Test();
flags: ACC_PUBLIC

Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1                  // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0

public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC

Code:
stack=1, locals=2, args_size=1
0: bipush        10
2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: return
LineNumberTable:
line 3: 0
line 4: 6
}


String 转 Integer(int)

简单说明字符串解析数字的规则:

1 判断第一位是否符号位,进行特殊处理

2 根据进制解析每一位字符的数值,比如12345字符串代码中的算法:(((((((-1) * 10 - 2) * 10 - 3) * 10) - 4) * 10) - 5 * 10);每一个括号是一次循环,取负是为了方便校验. 最后得出结果在返回正确的符号.

进行两次校验(确保不要超出int范围):

+ 第一次是 得出结果未乘以进制前的负数 要大于 limit(负数)/进制 (确保乘以进制不会超出int范围)

+ 第二次校验乘以进制后结果 result(负数) 要大于 limit(负数) + 这次的解析的数字(正数)(确保加上解析的数字不会超出int范围)

/**
*  Examples:
* parseInt("0", 10) returns 0
* parseInt("473", 10) returns 473
* parseInt("+42", 10) returns 42
* parseInt("-0", 10) returns 0
* parseInt("-FF", 16) returns -255
* parseInt("1100110", 2) returns 102
* parseInt("2147483647", 10) returns 2147483647
* parseInt("-2147483648", 10) returns -2147483648
* parseInt("2147483648", 10) throws a NumberFormatException
* parseInt("99", 8) throws a NumberFormatException
* parseInt("Kona", 10) throws a NumberFormatException
* parseInt("Kona", 27) returns 411787
*/
//静态方法 s:要转int的字符串 radix:进制
public static int parseInt(String s, int radix)
throws NumberFormatException
{
/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/

if (s == null) {
throw new NumberFormatException("null");
}
//进制 必须 大于等于 2 小于等于 36
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}

if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}

int result = 0;
boolean negative = false; //是否负数
int i = 0, len = s.length();
//负数的话 limit 取值 Integer.MIN_VALUE :-2147483648
//正数取值 -Integer.MAX_VALUE :-2147483647
int limit = -Integer.MAX_VALUE;
int multmin;
int digit;

if (len > 0) {
//取第一个字符,判断是否负数
char firstChar = s.charAt(0);
//如果第一个字符是符号位,解析符号赋值negative,并且将i 指向第二位字符
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s);

if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++; //自增,指向第二个字符
}
// 限制的最大值 / 进制 , 是解析结果没有 * 进制前 限制,最大的值,超过则说明解析字符串 超过int的最大范围(正数负数limit不同)
multmin = limit / radix;
//循环取出所有的字符
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
//字符根据进制获取数值,不能转换的返回-1
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
//没乘以进制之前与 limit / radix比较,因为用负数比较,如果result 小于 limit / radix,则字符串解析值大于int范围.
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
//乘以进制后 校验, result(负数) < limit(负数) + digit(这次解析到的数字,正数)  则超出int范围
//result < limit + digit
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
//result 赋值为 负的 字符解析的数值
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
//result 的到的都是负数,进行加符号返回
return negative ? result : -result;
}


字符串解析成int 的核心方法就是parseInt方法,其他字符串解析方法都是调用这个方法.

Integer(String s) 构造方法

int parseInt(String s)

int parseInt(String s, int radix) 核心方法

Integer valueOf(String s, int radix)

Integer valueOf(String s)

Integer getInteger(String nm, Integer val)

Integer getInteger(String nm, int val)

Integer getInteger(String nm)

Integer decode(String nm)

//构造函数
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}

public static int parseInt(String s) throws NumberFormatException{
return parseInt(s,10);
}

public static Integer valueOf(String s, int radix) throws NumberFormatException {
return Integer.valueOf(parseInt(s,radix));
}

public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
//注意这个nm 是 系统属性名字 , 通过 System.getProperty(nm)得到数字字符串调用Integer.decode解析成数字,第二个参数默认值
public static Integer getInteger(String nm, Integer val) {
String v = null;
try {
v = System.getProperty(nm);
} catch (IllegalArgumentException e) {
} catch (NullPointerException e) {
}
if (v != null) {
try {
return Integer.decode(v);
} catch (NumberFormatException e) {
}
}
return val;
}
//val是默认值
public static Integer getInteger(String nm, int val) {
Integer result = getInteger(nm, null);
return (result == null) ? Integer.valueOf(val) : result;
}

public static Integer getInteger(String nm) {
return getInteger(nm, null);
}

//这个方法是解析16进制 8进制字符串的.
//以0x 0X # 开头的是16进制
//以 0 开头(并且长度大于1)的是 8 进制
//其他是10进制
public static Integer decode(String nm) throws NumberFormatException {
int radix = 10;
int index = 0;
boolean negative = false;
Integer resul
11856
t;

if (nm.length() == 0)
throw new NumberFormatException("Zero length string");
char firstChar = nm.charAt(0);
// Handle sign, if present
//判断正负数 index记录数字开始的位置(跳过符号 进制开头)
if (firstChar == '-') {
negative = true;
index++;
} else if (firstChar == '+')
index++;

// Handle radix specifier, if present
//0x 开头 0X 开头 16进制
if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) {
index += 2;
radix = 16;
} else if (nm.startsWith("#", index)) { //#开头 16进制
index++;
radix = 16;
} else if (nm.startsWith("0", index) && nm.length() > 1 + index) {
//以0开头,并且去除符号位数大于1 是8进制
index++;
radix = 8;
}
//nm 第index位是已 - 或 + 开头,格式错误
if (nm.startsWith("-", index) || nm.startsWith("+", index))
throw new NumberFormatException("Sign character in wrong position");
//刨除符号位 进制格式位,其余数字调用Integer.valueOf(String,int) -Integer.parseInt(String, int)来解析数字
try {
//注意 这里传的nm.substring(index)是正数,正数解析会比负数小1,所以如果这个数字是Integer.MIN_VALUE,去掉符号位,会导致抛错
result = Integer.valueOf(nm.substring(index), radix);
//加上符号
result = negative ? Integer.valueOf(-result.intValue()) : result;
} catch (NumberFormatException e) {
// If number is Integer.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be
// rethrown.
//再重新解析一次,负数加上符号位,排除Integer.MIN_VALUE的错误
String constant = negative ? ("-" + nm.substring(index)) : nm
.substring(index);
result = Integer.valueOf(constant, radix);
}
return result;
}


int 转 String

涉及方法:

- String toString(int i, int radix)

- String toString(int i)

- String toString()

- String toHexString(int i)

- String toOctalString(int i)

- String toBinaryString(int i)

- String toUnsignedString(int i, int shift)

首先看 String toString(int i)方法:

/**
* Returns a {@code String} object representing the
* specified integer. The argument is converted to signed decimal
* representation and returned as a string, exactly as if the
* argument and radix 10 were given as arguments to the {@link
* #toString(int, int)} method.
*
* @param   i   an integer to be converted.
* @return  a string representation of the argument in base 10.
*/
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
//获取数字的位数,Integer.MIN_VALUE特殊处理,以为Integer.MIN_VALUE取负超出int最大范围.可以测试 -Integer.MIN_VALUE = Integer.MIN_VALUE,
//求补码得到该数字的 取负(-), Integer.MIN_VALUE再求补码等于自身.
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
//int转String的char数组
char[] buf = new char[size];
//调用这个方法为buf填充值
getChars(i, size, buf);
return new String(buf, true);
}

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };

// Requires positive x
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}

/**
* Places characters representing the integer i into the
* character array buf. The characters are placed into
* the buffer backwards starting with the least significant
* digit at the specified index (exclusive), and working
* backwards from there.
*
* Will fail if i == Integer.MIN_VALUE
*/
//参数 i:转String的数字, index:数字的最大位数, buf:存放数字转的字符数组
static void getChars(int i, int index, char[] buf) {
int q, r;
int charPos = index;
char sign = 0;
//数字小于0 ,转成正数,对Integer.MIN_VALUE无效
if (i < 0) {
sign = '-';
i = -i;
}

// Generate two digits per iteration
//每次生成两位放入buf最高位中
while (i >= 65536) {
q = i / 100;
// really: r = i - (q * 100);
// q*(64 + 32 + 4) = q*100,移位运算比较快
// i - q*100 得到 i 的最后两位数,i = q 剔除i的后两位
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
//通过查询DigitOnes DigitTens数组快速找到最后两位字符
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}

// Fall thru to fast mode for smaller numbers
// assert(i <= 65536, i);
// i < 65536进行转换
// 65536 * 52429 数字大于了int的最大值范围,然而没有超出2^32的范围
// 无符号右移 19位 , 相当于 (i * 52429)/ 2^19(524288) 相当于 i / 10
// 详细论证看开头的参考博客,里面进行了详细论证
for (;;) {
q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}
//用于快速查找 数字对应的字符
final static char [] DigitTens = {
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
'3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
'7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
'8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
'9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
} ;

final static char [] DigitOnes = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
} ;


其他方法:String toString(int i, int radix)

public static String toString(int i, int radix) {

if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;

/* Use the faster version */
if (radix == 10) {
return toString(i);
}

char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
//非负数设置为负数
if (!negative) {
i = -i;
}
//进制转换的算法 除进制取余,逆序排列的算法
while (i <= -radix) {
buf[charPos--] = digits[-(i % radix)];
i = i / radix;
}
buf[charPos] = digits[-i];
//加上符号位
if (negative) {
buf[--charPos] = '-';
}
//截取正确的位数
return new String(buf, charPos, (33 - charPos));
}

/**
* All possible chars for representing a number as a String
*/
final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};


其他方法: 转2 8 16进制 无符号数

+ String toUnsignedString(int i, int shift)

+ String toBinaryString(int i)

+ String toOctalString(int i)

+ String toHexString(int i)

/**
* Convert the integer to an unsigned number.
* 转成无符号数
* 私有静态方法,转换进制为 2的shift次方
* 如转16 进制 toUnsignedString(i, 4)
*/
private static String toUnsignedString(int i, int shift) {
//char 最长 2 进制 32 位 (无符号)
char[] buf = new char[32];
int charPos = 32;
int radix = 1 << shift; //得到进制
//radix - 1 与 i 做与操作,保留下 最后shift位二进制数,
// 获取digits中对应进制的数, i 在无符号右移 shift 位
int mask = radix - 1;
do {
buf[--charPos] = digits[i & mask];
i >>>= shift;
} while (i != 0);
//截取buf中有值的位数.
return new String(buf, charPos, (32 - charPos));
}
//转2进制
public static String toBinaryString(int i) {
return toUnsignedString(i, 1);
}
//转8进制
public static String toOctalString(int i) {
return toUnsignedString(i, 3);
}
//转16进制
public static String toHexString(int i) {
return toUnsignedString(i, 4);
}


继承Number的方法

int intValue();

long longValue();

float floatValue();

double doubleValue();

byte byteValue();

short shortValue();

将int类型强转成其他类型.(short,byte会截断高位)

实现Comparable接口

public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}


其他方法 位运算

static int highestOneBit(int i)

static int lowestOneBit(int i)

static int numberOfLeadingZeros(int i)

static int numberOfTrailingZeros(int i)

static int bitCount(int i)

static int rotateLeft(int i, int distance)

static int rotateLeft(int i, int distance)

static int reverse(int i)

static int signum(int i)

static int reverseBytes(int i)

/**
* 方法用途 - 取一个二进制数最先出现1的 位保留1 其余位都变成 0
* 比如 0100_1111 -> 0100_0000 , 保留最先出现 1的位,其余变 0 返回最高位为1, 其它位为0的数
* 计算方式 :比如一个二进制最高位第 n位  ,最低位为第1 位 :
* n , n|n-1 , n|n-1|n-2 , n|n-1|n-2|n-3, ... , n|n-1|...|2|1
* 那么最先出现 1 的位与其后的位 都是 1
* i - i 无符号向右移 1 位  得到最先出现 1的最高位为1 ,其余位都是 0
* (如  0111_1111 - 0011_1111 = 0100_0000)
*/
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >>  1);
i |= (i >>  2);
i |= (i >>  4);
i |= (i >>  8);
i |= (i >> 16);
return i - (i >>> 1);
}

//方法功能-得到最低位出现 1的其余位为0 的数
public static int lowestOneBit(int i) {
// HD, Section 2-1
//计算方式 : i补码 & i -> i的反码+ 1 & i
//因为 i反码+1 使最低位出现1 的变成 1,更低位的都是0,  i补码 & i得到正确的数
return i & -i;
}
//方法功能 - 取最高位为 1 前面 0 位的数量
//二分查找进行计算,不断缩小范围
public static int numberOfLeadingZeros(int i) {
// HD, Figure 5-6
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; }
if (i >>> 24 == 0) { n +=  8; i <<=  8; }
if (i >>> 28 == 0) { n +=  4; i <<=  4; }
if (i >>> 30 == 0) { n +=  2; i <<=  2; }
n -= i >>> 31;
return n;
}

//方法说明 - 取最低位是1 后面的 0 位的个数,二分查找法
public static int numberOfTrailingZeros(int i) {
// HD, Figure 5-14
int y;
if (i == 0) return 32;
int n = 31;
y = i <<16; if (y != 0) { n = n -16; i = y; }
y = i << 8; if (y != 0) { n = n - 8; i = y; }
y = i << 4; if (y != 0) { n = n - 4; i = y; }
y = i << 2; if (y != 0) { n = n - 2; i = y; }
return n - ((i << 1) >>> 31);
}

//计算 - 2进制是 1 的位数
//二分法 先计算每两位中的1的个数 , 再计算4位中1的个数 .. 32位中1的个数
//计算方式详细可以看参考 Java源码 Integer.bitCount实现过程 的博客
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}

//方法功能 - 循环左移 distance 位
//注意 移位运算32位 只有distance数字的低五位有效,64位数字 低6位有效
//所以 右移-distance位可以表示成 右移32 - distance位.
public static int rotateLeft(int i, int distance) {
return (i << distance) | (i >>> -distance);
}
//方法功能 - 循环右移 distance 位
public static int rotateRight(int i, int distance) {
return (i >>> distance) | (i << -distance);
}

//方法功能 - 翻转一个二进制数(32位,最低位变成最高位,第二 低位变成第二高位),同bitCount计算方式一样, 先翻转每两位的顺序,再翻转每4位中的顺序,再翻转每8位中的顺序,让后的到32位翻转后顺序
public static int reverse(int i) {
// HD, Figure 7-1
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) |
((i >>> 8) & 0xff00) | (i >>> 24);
return i;
}
//获得符号位 - 正数返回 1, 负数返回 -1, 0 返回 0
public static int signum(int i) {
// HD, Section 2-7
return (i >> 31) | (-i >>> 31);
}
//方法功能 - 翻转一个二进制数(最低8位变成最高8位,8位内顺序不翻转),方法原理同reverse
public static int reverseBytes(int i) {
return ((i >>> 24)           ) |
((i >>   8) &   0xFF00) |
((i <<   8) & 0xFF0000) |
((i << 24));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源码