位运算整理

运算符
&:按位与。

|:按位或。

~:按位非。

^:按位异或。

<<:左位移运算符。

>>:右位移运算符。

<<<:无符号右移运算符。
位运算规则图示
操作 值1 值2 值3 值4 备注
操作数1 0 0 1 1 -
操作数2 0 1 0 1 -
- - - - - -
与(&) 0 0 0 1 对应位同为1取1,其他情况取0
或(|) 0 1 1 1 对应位同为0时,结果为0,其余全为1.
异或(^) 0 1 1 0 相同取0,不同取1
非(~) - - - - 非为取反
位运算示例代码

    public static void main(String[] args) {
        int a = 1255;

        int b = 1205;

        //  20  10100
        printBinary(a);
        //  26  11010
        printBinary(b);
        // a&b  10000 (同时为1则取1,其他情况取0)
        xAnd(a, b);
        xOr(a, b);
        xNo(a);
        xNo(b);
        xEOr(a, b);
    }

    //字符截取
    public static int binaryToDecimal(String s) {
        int count = 0;
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            str = s.substring(s.length() - i - 1, s.length() - i);
            if (Integer.valueOf(str) == 0) {

                count += 0;
            } else if (i == 0) {
                count += 1;
            } else {

                count += add(i);
            }
        }
        return count;
    }

    //v=v<<1  左移等
    public static int add(int i) {
        int v = 1;
        for (int j = 0; j < i; j++) {
            v <<= 1;
        }
        return v;
    }

    private static void xAnd(int a, int b) {

        System.out.print(String.format("%s & %s = ", a, b));
        printBinary(a & b);
    }

    private static void xOr(int a, int b) {
        System.out.print(String.format("%s | %s = ", a, b));
        printBinary(a | b);
    }

    private static void xNo(int value) {
        System.out.print(String.format("%s: ~= ", value));
        printBinary(~value);
    }

    private static void xEOr(int a, int b) {

        System.out.print(String.format("%s ^ %s = ", a, b));
        printBinary(a ^ b);
    }

    private static void printBinary(int value) {
        String binaryString = Integer.toBinaryString(value);
        print(binaryString);
        println(String.format(" = %s", binaryToDecimal(binaryString)));
    }

    private static void println(Object value) {
        System.out.println(value);
    }

    private static void print(Object value) {
        System.out.print(value);
    }
输出结果
10011100111 = 1255
10010110101 = 1205
1255 & 1205 = 10010100101 = 1189
1255 | 1205 = 10011110111 = 1271
1255: ~= 11111111111111111111101100011000 = -1256
1205: ~= 11111111111111111111101101001010 = -1206
1255 ^ 1205 = 1010010 = 82
位移运算

计算和存储使用二进制的补码。

正数的补码是本身。

负数的补码将除符号为所有位取反后+1

<< 左位移运算: 符号位不变,低位补0。

1 << 1,转换为二进制即为
0000 0000 0000 0000 0000 0000 0000 0001  = 1
0000 0000 0000 0000 0000 0000 0000 0010  = 2
1 << 1 = 2

4 << 2 ,转换为二进制为
0000 0000 0000 0000 0000 0000 0000 0100  = 4
0000 0000 0000 0000 0000 0000 0001 0000  = 16
4 << 2 =16

6 << 5 ,转换为二进制为
0000 0000 0000 0000 0000 0000 0000 0110  = 6
0000 0000 0000 0000 0000 0000 1100 0000  = 192
6 << 5 = 192

>>右位移运算:低位溢出,符号位不变,并用符号位补溢出的高位

20 >> 2,转换为二进制为
0000 0000 0000 0000 0000 0000 0001 0100  = 20
0000 0000 0000 0000 0000 0000 0000 0101  = 5
20 >> 2 = 5

9 >> 3 ,转换为二进制
0000 0000 0000 0000 0000 0000 0000 1001  = 9
0000 0000 0000 0000 0000 0000 0000 0001  = 1
9  >> 3 = 1

-9 >> 3,转换为二进制为 
1111 1111 1111 1111 1111 1111 1111 0111 = -9
1111 1111 1111 1111 1111 1111 1111 1110
1111 1111 1111 1111 1111 1111 1111 0010 = -2

>>>无符号右移:将最高位也当作数字,高位补0,做右位移运算

-9 >> 3,转换为二进制为 
1111 1111 1111 1111 1111 1111 1111 0111 = -9
0001 1111 1111 1111 1111 1111 1111 1110 = 536870910
位移运算示例代码
    public static void main(String[] args) {
        leftMove(6, 5);
        rightMove(-9, 3);
        noCharRightMove(-9,3);
    }


    private static void leftMove(int value, int moveLength) {
        printBinary(value << moveLength);
    }

    private static void rightMove(int value, int moveLength) {
        printBinary(value >> moveLength);
    }

    private static void noCharRightMove(int value, int moveLength) {
        printBinary(value >>> moveLength);
    }

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