kotlin之位移算法

  • 前言

    最近公司为了拓展员工安卓开发技能,要求java和kotlin进行混合开发。为了快速将java代码转入kotlin,利用as自动转kotlin的方式,把java代码直接拷贝到kt文件中,大部分代码都能自动转成对应的kt代码,但是java中& ,|,>> ,<<等相关的位移代码不能正确转义过来。我就自己看了一下kotlin的位移相关的文档,把相应的java手动转成kotlin。

什么是位运算?
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如:4 & 3 => 100 | 11 = 111 =7

补码?
首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
正数的补码是其本身;
负数的补码是:符号位不变,其余各位求反,末位加1。

按位取反?
原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。如:101 的原码 0101 最高位0表示符号,其余位表示大小。
取反: 正数 -> 补码 取反(符号位取反) 减1 取反(符号位不变)
负数-> 原码 取反(符号位取反) 加1 取反(符号位不变)

  • kotlin常用的7种中缀表达式

  •  var a = 5,b = 11
     and  对应位都为1,则为1,如:a and b= 001 => 1   
     or     对应位有一个是1,则为1 如:a or b= 111 => 7
     xor   对应位值相同,则结果为0,否则为1 如:a xor b= 110 => 6
     inv   对应位取相反的值,如: a.inv() => 1010 =>1001 => 1110 => -110 =>-6
     shl   按位左移指定的位数,相当于乘以2的N次方。移掉的省略,右边缺失的位,用0补齐
     shr   按位右移指定的位数,相当于除以2的N次方,移掉的省略,左边缺失的位,如果是正数则补0,若为负数,可能补0或补1,这取决于所用的计算机系统
     ushr 按位右移指定的位数,移掉的省略,左边缺失的位,用0补齐 
    
  • 位运算应用

         var a = 5,b = 4
        1. 奇偶判断
        a and 1 == 0  //偶数
        a and 1 == 1  //奇数
        2. 交换两个整数的值
        a = a xor b
        b = a xor b
        a = a xor b
    
  • 总结
    位运算主要在直接操控二进制数时进行使用,可以达到节约内存,使你的程序运行速度更快Java定义了位运算符,可应用在整形(int)、长整型(long)、短整型(short)以及字符型(byte)等类型上。位运算符作用在所有的位上,并按位进行运算。Kotlin与之略有不同,它并没有提供特殊的操作符,只提供了中缀形式的表示方法,并且Kotlin只可用在Int和Long类型上

你可能感兴趣的:(android)