位运算基本分为六种(按位与、按位或、按位异或、按位取反、左移和右移)
位运算会把数字转化为二进制,码数不同的则在前面补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
移位运算中如果出现如下情况,其行为未定义:
- 右操作数(即移位数)为负值;
- 右操作数大于等于左操作数的位数;
- 对于左移操作,需要确保移位后的结果能被原数的类型容纳,否则行为也是未定义的。对一个负数执行左移操作也未定义。
- 对于右移操作,右侧多余的位将会被舍弃,而左侧较为复杂:对于无符号数,会在左侧补 ;而对于有符号数,则会用最高位的数(其实就是符号位,非负数为 ,负数为 )补齐。
标签:右移,运算,符号,左移,补码,按位 From: https://www.cnblogs.com/sixsix666/p/17872749.html