原码、反码、补码、位运算概念

运算符

  • 取模% 的原则: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
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值