java位运算相关
交换的处理(每两bit位的奇偶位置交换)
x=temp&0x55555555;//使用16个01组成的long,可以取出奇数位 为x
y=temp&0xaaaaaaaa;//使用16个10组成的long,可以取出偶数位 为y
x<<1|y>>>1;//拼接(>>>表示无符号右移,移到右边的低位被舍弃,对于无符号数高位补0,只对32位和64位有意义;而>>表示有符号右移,对于无符号数高位补0,负数高位补1;<<表示左移,右边补0。左移不区分是否有符号)
取值
取值只需要&要保留的对应位置为1的值就好了,比如需要将右移出来的最低2位放到另一个数的最高2位。
low>>>2;//右移两位,右移注意看是有符号还是无符号。即空出最高两位
(high&3)<<30;//&3即取出high的最低两位,然后右移到最高两位
(low>>>2)+((high&3)<<30);//两个值相加,即high的最低2位当成最高两位&low的其余位数,组成一个新的数
常用的二进制
0xaaaaaaaa=10101010101010101010101010101010 //偶数位为1,奇数为0.与原来的数相与,取偶数位
0x55555555=01010101010101010101010101010101 //偶数位为0,奇数为1.与原来的数相与,取奇数位
0x33333333 = 110011001100110011001100110011 //1和0每隔两位交替出现
0xcccccccc = 11001100110011001100110011001100 //0和1每隔两位交替出现
0x0f0f0f0f = 00001111000011110000111100001111 //1和0每隔四位交替出现
0xf0f0f0f0 = 11110000111100001111000011110000 //0和1每隔四位交替出现
0x为十六进制的前缀标识,0为八进制的前缀标识