java二进制表示形式与移位操作符

1.java二进制表示形式

java中数字的二进制表示形式称为“有符号的二进制补码”,下面先介绍原码,反码,补码。

编码 计算方法
原码 用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码 正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。
补码 正数的补码等于他的原码,负数的补码等于反码+1。

例如,对于4位二进制来说

十进制 原码 反码 补码
4 0100 0100 0100
-4 1100 1011 1100

2.移位操作符

左操作数 移位操作符 右操作数,移位操作符的运算对象是二进制的“位”。移位操作符只可用来处理整数类型。如果对于char,byte或者short类型的数值进行位移处理,那么在位移进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值。位移操作符有个需要注意的点,在下面会介绍到。位移操作符可分为以下三种:

1.左移位操作符(<<)

左移位操作符(<<):按照右操作数指定的位数将左操作数向左移动(在低位补0)

public class Example{
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a <<2) + " 二进制:" + Integer.toBinaryString(a <<2));
        a = Integer.MIN_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a <<2) + " 二进制:" + Integer.toBinaryString(a <<2));
    }
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:-4 二进制:11111111111111111111111111111100
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:0 二进制:0
  1. 上面第一行的二进制共31位(理论为01111111111111111111111111111111,共32位,高位0未打印,下面的类似),这是int类型的最大值。
  2. 第二行是Integer.MAX_VALUE经过左移2位后的结果,二进制共32位,首位为1,代表负数。
  3. 第三行二进制共32位,对应的十进制是Integer.MIN_VALUE。
  4. 第四行是Integer.MIN_VALUE经过左移2位后的结果,高2位被移除,末尾补0,得到32位0。

2.“有符号”右移位操作符(>>)

“有符号”右移位操作符(>>):按照有操作数指定的位数将左操作数向右移动。“有符号”右移操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插入1。

public class Example{
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a >>2) + " 二进制:" + Integer.toBinaryString(a >>2));
        a = Integer.MIN_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a >>2) + " 二进制:" + Integer.toBinaryString(a >>2));
    }
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:536870911 二进制:11111111111111111111111111111
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:-536870912 二进制:11100000000000000000000000000000
  1. 第一行和第三行与上面一样。
  2. 第二行二进制共29位,Integer.MAX_VALUE向右移2位,因为符号为正数,高位插入0。
  3. 第四行二进制共32位,Integer.MIN_VALUE向右移2位,因为符号为负数,高位插入1。

3.“无符号”右移位操作符(>>>)

“无符号”右移位操作符(>>>):使用“零扩展”,无论正负,都在高位插入0。

public class Example{
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a >>>2) + " 二进制:" + Integer.toBinaryString(a >>>2));
        a = Integer.MIN_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a >>>2) + " 二进制:" + Integer.toBinaryString(a >>>2));
    }
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:536870911 二进制:11111111111111111111111111111
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:536870912 二进制:100000000000000000000000000000
  1. 第1,2,3行与上面相同。
  2. 第四行二进制共30位,Integer.MIN_VALUE向右移2位,在高位补0(0没显示)。

4.注意

《Java编程思想》:只有数值右端的低5位才有用。这样可防止我们移位超过int类型值所具有的位数。(译注:因为2的5次方为32,而int类型值只有32位。)若对于一个long类型的数值进行处理,最后得到的结果也是long,此时只会用到数值右端的低6位,以防止位移超过long型数值具有的位数。

这是什么意思?对于移位操作:左操作数 移位操作符 右操作数。在Java中int类型大小为32bits,long类型大小为64bits。Java不允许一次位移操作移动左操作数的所有位,也就是说int类型的左操作数最多只能移动31位,long类型的左操作数只能移动63位。31对应的二进制为11111共5位,63对应的二进制为111111共6位。左操作数位int型,如果右操作数为32(二进制100000共6位),那么只取低5位,也就是00000,结果就是没变化。

public class Example{
    public static void main(String[] args) {
        int a = Integer.MIN_VALUE;
        System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
        System.out.println("十进制:" + (a >>1) + " 二进制:" + Integer.toBinaryString(a >>1));
        System.out.println("十进制:" + (a >>31) + " 二进制:" + Integer.toBinaryString(a >>31));
        System.out.println("十进制:" + (a >>32) + " 二进制:" + Integer.toBinaryString(a >>32));
        System.out.println("十进制:" + (a >>33) + " 二进制:" + Integer.toBinaryString(a >>33));
    }
}

输出结果:

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

推荐阅读更多精彩内容