位运算应用和解析


 1 public class jinzhi {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5           
 6          Integer[] a = getIndexFromSncTpId(0x01011213,0); 
 7          for (int i = 0; i < a.length; i++) {
 8              System.out.println(a[i]);
 9         }
10          System.out.println("--------------------------------");
11          int b = 0x01011213 ;
12          System.out.println(b);
13          System.out.println(b >> 24);
14          System.out.println(b >> 16);
15          System.out.println(b >> 8);
16          System.out.println(b >> 0);
17          System.out.println(b);
18          System.out.println("--------------------------------");
19          System.out.println("----------------反解------------------");
20          
21          //Math.pow(x,y)的作用就是计算x的y次方,其计算后是浮点数
22          int tpIdH = (int)(1 * Math.pow(16, 6) + 1 * Math.pow(16, 4) + 18 * Math.pow(16, 2) + 19);
23          System.out.println(tpIdH);
24          int tpIdH1 = (int)(1 * Math.pow(2, 24) + 1 * Math.pow(2, 16) + 18 * Math.pow(2, 8) + 19);
25          System.out.println(tpIdH1);
26 
27     }
28     
29     public static Integer[] getIndexFromSncTpId(int tpIdH, int tpIdL){
30         Integer index[] = new Integer[8];
31         
32         for(int i = 0; i < 4; i ++)
33             index[i] = ((int) tpIdH >> 8*(3 - i)) & 0xff;
34         
35         for(int i = 4; i < 8; i ++)
36             index[i] = ((int) tpIdL >> 8*(7 - i)) & 0xff;
37         
38     
39         return index;
40     }

 结果:

1
1
18
19
0
0
0
0
--------------------------------
16847379
1
257
65810
16847379
16847379
--------------------------------
----------------反解------------------
16847379
16847379
16847379
解析:
0x01011213 二进制为 1000000010001001000010011 共25位,补足32位为:00000001000000010001001000010011
网元分八位为一组,共4组 :
slot subSlot port subport
00000001 | 00000001 | 00010010 | 00010011
1 1 18 19
右移24位就是获取 slot ; 右移16位就是获取 subslot ; 右移8位就是获取 port ;右移0位就是获取 subport
&0xff 就是去掉左边多余的值 0xff 二进制为 11111111 如果遇到多余8位的,前面补0 如16位的 00010010 | 00010011 & 0xff 等同于
 00010010 | 00010011 
&
00000000 | 11111111

00000000 | 00010011 = 19
如获取port 二进制为 00010010  由 00000001 | 00000001 | 00010010 | 00010011  向右位移8位为 00000001 | 00000001 | 00010010 想要获取port所代表的的值就要&0xff(11111111)去除port左边16位的值
00000001 | 00000001 | 00010010
&
00000000 | 00000000 | 11111111

00000000 | 00000000 | 00010010 = 18




原文地址:https://www.cnblogs.com/lhq1996/p/13066256.html