JAVA 位运算

计算机和真实生活中不同,一个数在计算机中只能以二进制(0或者1)的方式表示,现实生活中主要以十进制表示,在二进制的标示中,最高位是符号位,最高位如果为0 ,则表示该数的十进制表示为正数,如果最高位为1,则该数位负数。以十进制3为例,改为8位的二进制,则是[0000 0011],如果是-3转换为8位的二进制是[1000 0011].在这里[0000 0011] 与3表示的意思相同 ,不过[0000 0011] 是机器数,3为真值。

原码, 反码, 补码的基础概念

1. 原码

原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

若以1000  0010 为例子

最高位为‘1’,表示这是一个负数,其他七位为‘000  0010’

即(0*2^7)+(0*2^6)+(0*2^5)+(0*2^4)+(0*2^3)+(0*2^2)+(1*2^1)+(0*2^0)=2(‘^’表示幂运算符)

所以1000  0010 是-2

2.反码

反码:正数的反码还是等于原码

负数的反码就是他的原码除符号位外,按位取反

若以带符号位的八位二进制数为例:

3是正数,反码与原码相同,则可以表示为0000 0011

-3的原码是1000 0011,符号位保持不变,低七位(000 0011)按位取反得(100  1100)

3.补码

补码:正数的补码等于他的原码

负数的补码等于反码+1。

(这只是一种算补码的方式,多数书对于补码就是这句话)

前言

日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法。举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1。可能的做法是使用三木运算符,判断原始值为1还是0,如果是1,设置为0,否则设置为0.但是使用位运算,不用判断原始值,直接改变值就可以。当然,一条语句可能对代码没什么影响,但是在高重复,大数据量的情况下将会节省很多开销。

位运算符

一些只需要一个操作数的运算符称为一元运算符(或单目运算符)。

二元运算是由两个元素形成第三个元素的一种规则。例如数的加法乘法;更一般地,由两个集合形成第三个集合的产生方法或构成规则称为二次运算。(或双目运算符)

位逻辑运算符

位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或)。除了 ~(即位取反)为单目运算符外,其余都为双目运算符。表 1 中列出了它们的基本用法。

位与运算符

位与运算符为&,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。

例如下面的表达式:100&0

0110 0100  ---> 100

&0000 0000 --->  0

  0000 0000 --->  0

代码实现:

      int x = 100,y = 0;

      int z = x&y;

      System.out.println("运算结果:"+z);

//运算结果:0

位或运算符

位或运算符为|,其运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。

下面是一个使用位或运算符的表达式:4|7

0000 0100--->4

|    0000 0111--->7

    0000 0111--->7

代码验证:

  int x = 4,y = 7;

      int z = x|y;

      System.out.println("运算结果:"+z);

//运算结果:7

位异或运算符

位异或运算符为^,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1

下面是一个使用位异或运算符的表达式:4^7

0000 0100--->4

^  0000 0111--->7

    0000 0011--->3

代码验证:

      int x = 4,y = 7;

      int z = x^y;

      System.out.println("运算结果:"+z);

//运算结果:3

位取反运算符

位取反运算符为~,其运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。

下面是一个使用位取反运算符的表达式: ~5

位移运算符

位移运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。表 2 列出了 Java 语言中的两个位移运算符,它们都属于双目运算符。

左位移运算符

左移位运算符为«,其运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

例如,将整数 7向左位移 1 位的过程如下:

                0000 0111

                00000 1110---->14

原来数的所有二进制位都向左移动 1 位。原来位于左边的最高位 0 被移出舍弃,再向尾部追加 0 补位。最终到的结果是14,相当于原来数的 2 倍。

代码验证:

      int x = 7;

      int z = x <<1;

      System.out.println("运算结果:"+z);

      //运算结果:14

右位移运算符

右位移运算符为»,其运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。

例如,将整数 7向右位移 1 位的过程如下:

                        0000 0111

0000 00111---->3

原来数的所有二进制位都向右移动 1 位。原来位于右边的最低位 1 被移出舍弃,再向最高位追加 0 补位。最终到的结果是 3,相当于原数整除 2 余数舍弃的结果。

复合位赋值运算符

所有的二进制位运算符都有一种将赋值与位运算组合在一起的简写形式。复合位赋值运算符由赋值运算符与位逻辑运算符和位移运算符组合而成。表 3 列出了组合后的复合位赋值运算符。

  int a = 1;

      int b = 2;

      int c = 3;

      a &= 4;

      a |= 4;

      a ^= c;

      a -= 6;

      b >>= 1;

      c <<= 1;

      System.out.println("a = " + a);

      System.out.println("b = " + b);

      System.out.println("c = " + c);

        a = 1

        b = 1

        c = 6

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