位操作

1.概念:

​ In digital computer programming, a bitwise operation operates on one or more bit patterns or binary numerals at the level of their individual bits. It is a fast, simple action directly supported by the processor, and is used to manipulate values for comparisons and calculations.
​ On simple low-cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition. While modern processors usually perform addition and multiplication just as fast as bitwise operations due to their longer instruction pipelines and other architectural design choices, bitwise operations do commonly use less power because of the reduced use of resources.(维基百科)

位操作是程序设计中对位模式按位或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

2.操作对象:

​ Java位运算是针对于整型类型的二进制进行的移位操作
​ Java整型数据类型有:byte、char、short、int、long
位操作操作的是补码!补码!补码!(重要的事情说三遍)

要把他们转换成二进制形式,必须首先知道他们各占多少字节:

数据类型 所占位数
byte 8
boolean 8
short 16
int 32
long 64
float 32
double 64
char 16

3.操作符

​ Java位操作包括位操作符移位操作
​ 位操作符包括:&(位与) , |(位或) , ^(位异或) , ~(位非)
​ 位移操作包括:<<(左移) , >>(右移) , >>>(无符号右移)

下面简单举例说明一下各种位操作

3.1 &(位与)

4&6
0000 0000 0000 0000 0000 0000 0000 0100  
0000 0000 0000 0000 0000 0000 0000 0110  
0000 0000 0000 0000 0000 0000 0000 0100  
结果:4  

再看负数的情况:

-1&6  
1000 0000 0000 0000 0000 0000 0000 0001  //-1的原码  
1111 1111 1111 1111 1111 1111 1111 1110  //-1的反码  
1111 1111 1111 1111 1111 1111 1111 1111  //-1的补码  
0000 0000 0000 0000 0000 0000 0000 0110  //6的补码(正数的补码,反码和原码相同)  
0000 0000 0000 0000 0000 0000 0000 0110  //计算后的补码(首位为0则是正数,原码与补码相同)  
结果:6

3.2 |(位或)

4|6  
0000 0000 0000 0000 0000 0000 0000 0100  
0000 0000 0000 0000 0000 0000 0000 0110  
0000 0000 0000 0000 0000 0000 0000 0110  
结果:6  

3.3 ^(位异或)

4^6  
0000 0000 0000 0000 0000 0000 0000 0100  
0000 0000 0000 0000 0000 0000 0000 0110  
0000 0000 0000 0000 0000 0000 0000 0010  
结果:2

3.4 ~(位非)

~4  
0000 0000 0000 0000 0000 0000 0000 0100  
1111 1111 1111 1111 1111 1111 1111 1011  //符号位为1,表示负数,所以应该计算原码  
1111 1111 1111 1111 1111 1111 1111 1010  //-1获取反码  
1000 0000 0000 0000 0000 0000 0000 0101  //原码  
结果:-5

3.5 <<(左移)

位移运算如果位移超过该数据类型表示范围,则先取模,再进行运算(比如针对int型,4>>32等价于4>>0)

2 >> 2  
0000 0000 0000 0000 0000 0000 0000 0010  
0000 0000 0000 0000 0000 0000 0000 1000   //左移两位  
结果:8

3.6 >>(右移)

若正数,高位补0,负数,高位补1

4 >> 2  
0000 0000 0000 0000 0000 0000 0000 0100  
0000 0000 0000 0000 0000 0000 0000 0001  
结果:1

3.7 >>>(无符号右移)

不论正负,高位均补0

-1 >>> 1  
1111 1111 1111 1111 1111 1111 1111 1111  //-1补码  
0111 1111 1111 1111 1111 1111 1111 1111  
结果:2147483647 

4.应用场景

  • 判断int型变量a是奇数还是偶数
 a&1 = 0 偶数
 a&1 = 1 奇数 
  • 求平均值,如果x+y的和会超过int型的值的范围,就可以使用位运算来解决
 公式为 (x&y)+((x^y)>>1) 
 下面简单解释一下:  
 在二进制进行计算时,x和y的二进制的对应位都有2种情况(相同,不同)。
 相同情况下0+0还是0,不用管。1+1需要向前进一位,但是最后会除以2,所以还是原来位置。
 不同情况1+0计算结果为1,最后除以2需要右移一位。
  • 对于一个大于0的整数,判断它是不是2的n次方
   ((x&(x-1))==0)&&(x!=0)
  • 有两个int类型变量x、y,要求两者数字交换
 x ^= y;   
 y ^= x;   
 x ^= y; 
  • 求绝对值
 int abs( int x )   
 {   
   int y ;   
   y = x >> 31 ;   
   return (x^y)-y ; //or: (x+y)^y   
 }  
 //如果x为负,其实结果就是对负数求负

看不明白的点这里

  • 取模运算
 a % (2^n) 等价于 a & (2^n - 1)   
 //这个在HashMap的原码中用到了,根据key的hash值插入桶中的时候 
  • 求相反数
 ~x+1

没有啦,以后遇到一些比较好的位操作使用场景会再来更新
如果发现有什么问题,请联系我更改

参考:
Java位运算总结:位运算用途广泛
Java基础——原码, 反码, 补码 详解
wikipedia.Bitwise_operation
java基本位操作
绝对值函数(位操作法)

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