运算符
- 取模% 的原则:a % b = a -a/b * b
println(10 % 3) -->1
println(-10 % 3) --> -1
println(-10 % -3) --> -1
println(10 % -3) --> 1
源码、反码、补码
-
三种都有符号位和数值位两部分,符号位都用“0”表示正数,用"1"表示负数,在计算系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理,同时加法减法也可以统一处理,按减法处理。
-
原码,最高位表示符号位,其他位表示数值
-
反码,对于正数而言,它的反码与原码是相同的,对于负数的反码,是由其原码的符号位不变,其余按位取反。
-
补码,正数的补码和原码相同,对于负数的补码,是由其源码的符号位不变,其余位按位取反,再在最低位加1。如:?+x=0000000000000 ,则 ? = ~x + 1(补码的诞生是为了简化操作,用加法能实现减法)
与、或、非、异或
- 异或 ^ 俗称不进位加法 x ^ y; 如果x与y相同,则为0,不同则为1, n ^ 0 = n; n ^ n = 0;
- 异或技巧:用于交换两个数的值 a = a ^ b; b = a ^ b; a = a ^ b; 三步完成交换
- 一组数组中,其他数都出现2次,只有一个数出现一次,找出只出现1次的数
int[] arr = {1, 2, 3, 1, 2, 3 ,4 ,5, 5 };
int flag = 0;
for (int i = 0 ; i < arr.length; i++){
flag ^= arr[i];
}
System.out.println(flag); //结果为4
- 与 “&”, n & m ,先转换为 2 进制 ,同为1,则为1, 其余都为0;
- 与的技巧:用于判断奇偶性,m & 1, 若为结果为1,表示奇数,为0,表示偶数,原因,奇数的二进制最后一位为1
- 或 “|”, n | m ,先转换为 2 进制 ,都为0时为0, 其余都为1;
- 取反“~”, ~n ,先把n转换为2 进制,取反,0变1, 1变0
赋值运算符(位运算)
- <<= 如: num <<=2—》num = num <<2,表示左移两位后再赋值,左移n位就表示乘以2^n
- “>>=” 右移n位表示除以2^n
- <<< 和 >>> 表示无符号位移,即符号不会变
def main(args: Array[String]): Unit = {
var num = 10
num = num <<2 //向左位移两次,每位移一次都是在原来的数上进行 * 2
println(num) //结果为 40
var num1 = 10
num1 = num1 >>2 //向右位移两次,每位移一次都是在原来的数上进行 / 2
println(num1) //结果为 2
}