位运算

发布时间 2023-12-03 11:34:51作者: sixsix666

位运算基本分为六种(按位与、按位或、按位异或、按位取反、左移和右移

位运算会把数字转化为二进制,码数不同的则在前面补0直到码数相同,(eg:14-1110,6-110,补码6-0110)之后按照每一位进行比较

位运算速度快

 

 一:按位与、按位或、按位异或

   按位与 :与数字系统的与门类似,只有两个对应的都为1才是1其余为0,计算机符号为&

   按位或:只要两个对应位中有一个1时就为1,相当于只有两个都为0才为0,计算机符号| 

   按位异或:只有两个对应位不同才为1,相同为0,计算机符号为^

***在进行逻辑运算的时候应当用两个&&,||注意区分。Java中if循环用一个&或一个|不会报错当作逻辑符号进行使用但&|也有按位运算

二:取反(符号~)

运算符为 ~,作用是把数字的二进制补码中的0和1全部取反(0变为1,1变为0

补码:非负数的补码为其本身,负数的补码为取反后加上1(数字系统中2'complement system的用法)

三:左移和右移

num << i 表示将num的二进制表示向左移动  位所得的值。

num >> i 表示将num的二进制表示向右移动  位所得的值。

   eg:3<<3==24     <<代表左移,>>代表右移,左移右移符号右边接的数字即为2的多少次方,3则为2的三次方

     3<<2==12     左移类似与乘,右移类似于除(除相当于int类型的\,不看余数只看商)  

     11>>2==2

     12>>2==3

移位运算中如果出现如下情况,其行为未定义:

  1. 右操作数(即移位数)为负值;
  2. 右操作数大于等于左操作数的位数;
  3. 对于左移操作,需要确保移位后的结果能被原数的类型容纳,否则行为也是未定义的。对一个负数执行左移操作也未定义。
  4. 对于右移操作,右侧多余的位将会被舍弃,而左侧较为复杂:对于无符号数,会在左侧补 ;而对于有符号数,则会用最高位的数(其实就是符号位,非负数为 ,负数为 )补齐。