探索Integer番外篇之Integer.reverse(int i)和reverseBytes

图片来源于网络,阿里巴巴与Yoox Net-A-Porter成立合资公司

1. 前言


Integer.reverse(int i):二进制按位反转
Integer.reverseByte(int i):二进制按byte反转

2. 源码


(1) Integer.reverse(int i):二进制按位反转

    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;
    }

解析如下,i,设
i = b_0*2^0+b_1*2^1+b_2*2^2+...+b_{30}*2^{30}+b_{31}*2^{31}
第一步:计算 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555( & 优先级大于 | )
(i & 0x55555555) << 1的结果为
b_0*2^1+b_2*2^3+b_4*2^5+...+b_{28}*2^{29}+b_{30}*2^{31}
(i>>>1) & 0x55555555的结果为
b_1*2^0 + b_3*2^2 + b_5*2^4+...+b_{29}*2^{28}+b_{31}*2^{30}
所以, i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555的结果为
\begin{eqnarray*} i = b_1*2^0 + b_0*2^1+b3*2^2+b2*2^3+...+b_{31}*2^{30}+b_{30}*2^{31} \end{eqnarray*}
第二步:计算i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333
(i & 0x33333333) << 2的结果为
b_1*2^2 + b_0*2^3+b5*2^6+b4*2^7+...+b_{29}*2^{30}+b_{28}*2^{31}
(i >>> 2) & 0x33333333的结果为
b_3*2^0 + b_2*2^1+b7*2^4+b6*2^5+...+b_{31}*2^{28}+b_{30}*2^{29}
所以,i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333的结果为
\begin{eqnarray*} i = b_3*2^0 + b_2*2^1 + b_1*2^2+b_0*2^2+b_7*2^4+b_6*2^5+b_5*2^6 + b_4*2^7\\ +...+b_{31}*2^{28}+b_{30}*2^{29}+b_{29}*2^{30}+b_{28}*2^{31} \end{eqnarray*}
第三步:计算 i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
这里不一步步地计算,同理,直接给出结果,
\begin{eqnarray*} i = &b_7*2^0&+b_6*2^1+... + b_1*2^6+b_0*2^7 \\ +...+ &b_{15}*2^8& + b_{14} * 2^9 + ...+b_9*2^{14}+b_8*2^{15}\\ +...+ &b_{23}*2^{16}&+ b_{22}*2^{17}+...+ b_{17}*2^{22}+ b_{16}*2^{23}\\ +...+&b_{31}*2^{24}&+b_{30}*2^{25}+...+b_{25}*2^{30}+b_{24}*2^{31} \end{eqnarray*}
第四步:计算 i = (i << 24) | ((i & 0xff00) << 8) |((i >>> 8) & 0xff00) | (i >>> 24),
i << 24的结果为
b_7*2^{24}+b_6*2^{25}+...+ b_1*2^{30}+b_0*2^{31}
(i & 0xff00) << 8) 的结果为
b_{15}*2^{16}+ b_{14}*2^{17}+...+ b_{9}*2^{22}+ b_{8}*2^{23}
(i >>> 8) & 0xff00的结果为
b_{23}*2^{8}+ b_{22}*2^{9}+...+ b_{17}*2^{14}+ b_{16}*2^{15}
(i >>> 24)的结果为
b_{31}*2^0 + b_{30}*2^1 + ... + b_{25}*2^6 + b_{24}*2^7
所以,i = (i << 24) | ((i & 0xff00) << 8) |((i >>> 8) & 0xff00) | (i >>> 24)的结果
i = b_{31}*2^0 + b_{30}*2^1 + ... + b_1{30} + b_0{31}

(2) Integer.reverse(int i):二进制按位反转

原理同上,这里就不详细解释了,代码如下

    public static int reverseBytes(int i) {
        return ((i >>> 24)           ) |
               ((i >>   8) &   0xFF00) |
               ((i <<   8) & 0xFF0000) |
               ((i << 24));
    }

3.后言

4步法反转二进制数字,你学会了吗?


其他

本人也是在慢慢学习中,如有错误还请原谅、敬请指出,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,069评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,212评论 1 287
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,912评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,424评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,741评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,194评论 1 206
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,553评论 2 307
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,289评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,923评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,251评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,775评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,144评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,698评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,658评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,214评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,159评论 2 258