一、位操作:

shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与  &
or(bits) – 或   ||
xor(bits) – 异或
inv() – 反向

val a = 5
val b = a shl 2 //左移2位,5*2*2=20
println(b)  //20

二、位运算符:

运算符 表示含义
and(bits) 按位与
or(bits) 按位或
inv(bits) 按位非
xor(bits) 按位异或
shl(bits) 左移运算符
shr(bits) 右移运算符
ushr(bits) 无符号右移运算符

注意:Kotlin的位运算符只能对Int和Long两种数据类型起作用。

(src[i].toInt().ushr(4)) and 0x0F)

三、位操作和位运算实例

通过位运算来保证头尾不超过数组范围,通过位操作来扩容(数组长度保持为2的整数倍,方便进行位运算)

//如ArrayDeque通过位与运算(等价于java中的'&'),保证头尾不超过数组边界
class SimpleIntArrayDeque {private var elements: Array<Int?> = arrayOfNulls(16) //扩容数组private var head: Int = 0 //头private var tail: Int = elements.size //尾,tail-1是当前最后一位数据fun addFirst(value: Int) {if (value == null)throw NullPointerException()//当head-1为-1时,实际上是11111111&00111111,结果是00111111,也就是物理数组的尾部15;head = (head - 1) and (elements.size - 1)elements[head] = valueif (head == tail)doubleCapacity()}fun addLast(value: Int) {if (value == null)throw NullPointerException()elements[tail] = value//当tail+1为16时,实际上是01000000&00111111,结果是00000000,也就是物理数组的头部0;tail = (tail + 1) and (elements.size - 1)if (tail == head)doubleCapacity()}fun pollFirst(): Int? {val h = headval result = elements[h]if (result != null) {elements[h] = nullhead = (h + 1) and (elements.size - 1)}return result}fun pollLast(): Int? {val t = (tail - 1) and (elements.size - 1)val result = elements[t]if (result != null) {elements[t] = nulltail = t}return result}//扩容:插入数据前,判断插入后将头尾相等(即插入后数组将填满),则立即扩容private fun doubleCapacity() {val p = headval n = elements.sizeval r = n - pvar newCapacity = n shl 1  //扩容2倍if (newCapacity < 0)throw IllegalArgumentException("Sorry, deque too big")var newElements: Array<Int?> = arrayOfNulls(newCapacity)//从头部开始拷贝,拷贝头部以后的所有内容,并把头部位置重置为0System.arraycopy(elements, p, newElements, 0, r)/*** 从0开始拷贝,拷贝头部之前的内容,并把拷贝内容接上刚才拷贝的位置,* 使得原来的数组放到新数组的前半部分*/System.arraycopy(elements, 0, newElements, r, p)//释放旧的数组内存Arrays.fill(elements, null)elements = newElementshead = 0tail = n}fun size(): Int {  //插入前判断,若插入后占满则立即扩容,因此size不会大于数组长度减一return (tail - head) and (elements.size - 1)}fun isEmpty(): Boolean {return head == tail}fun peekFirst(): Int? {return elements[head]}fun peekLast(): Int? {return elements[(tail -1) and (elements.size - 1)]}
}

kotlin位操作和位运算相关推荐

  1. NUC1419 位操作【位运算+STL】

    位操作 时间限制: 8000ms 内存限制: 65535KB 通过次数: 2总提交次数: 2 问题描述 假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位 ...

  2. POJ3748 位操作【位运算+STL】

    位操作 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9433   Accepted: 3796 Description 假 ...

  3. C/C++位操作、位运算

    在C语言中,可以单独操控变量的位(bit),一般高级语言不会处理这级别的细节,C在提供高级语言便利的同时,还能为汇编语言所保留的级别上工作,这使其成为编写设备驱动程序和嵌入式代码的首选语言. 目录 二 ...

  4. 【Java位运算】n1和n>>1含义

    相关文章,配合食用: Java中去除整数二进制的最后一个1(位操作) 位运算是执行效率非常高的运算,刷题中,有时候使用会有奇效.但位运算还是不太好理解的,这里记录两个常用的位运算. n&1 n ...

  5. Bailian3718 位操作练习【位运算】

    位操作练习 总时间限制: 1000ms 内存限制: 65536kB 描述 给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位 ...

  6. c语言结构体的位操作,C语言之路---结构体、位运算及预处理命令

    一.结构体 1).概念 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member). 结构体也是一种数据类型,它由程序员自己定 ...

  7. python中不同进制的整数之间可以直接运算_Python 进制转换、位运算

    一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...

  8. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  9. java double 位运算_JAVA位运算等运算符总结

    JAVA位运算等运算符总结 一.概述 运算符是一种"功能"符号,用以通知 Java 进行相关的运算. Java 语言中常用的运算符可分为如下几种:算术运算符 赋值运算符 比较运算符 ...

最新文章

  1. 博士毕业论文悲情致谢女友回应:学术是一场超越金钱的修行。
  2. 如何将Visio图形转换成EPS格式【mark from百度知道】
  3. 一个项目的性能优化经验
  4. word手写字体以假乱真_学会Word上下标,搞定公式输入
  5. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet
  6. Linux异步之信号(signal)机制分析
  7. 三阶汉诺塔java源代码_如何使用Java实现汉诺塔问题求解
  8. python 笔记 之 线程锁
  9. 1007 Maximum Subsequence Sum(25 分)
  10. 【韦东山嵌入式Linux】Linux命令入门笔记
  11. ViewStub你肯定听过,但是这些细节了解吗?
  12. 印刷点阵字体_印刷术—类型族,分类和组合字体
  13. 人工智能对摄影测量与遥感的影响与挑战——龚健雅院士
  14. 华为交换机ntp自动校时配置
  15. 一锁知千秋,再和腾讯大佬的技术对话,我还是小看锁了!面试加分的答案都已安排
  16. 如何规避苹果审查,实现app store上的app版本强制更新
  17. five86-2靶机渗透攻略
  18. Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排
  19. 性能测试之cpu监控的结论
  20. VC6.0补丁Vs6sp6安装方法

热门文章

  1. 上海交大计算机考研复试刷人,2019上海交大初试第4也被刷,复试真要早准备!...
  2. 如果你月薪不到6千,请收好这7个app,能让你自我提升,工资翻倍
  3. Linux shell获取当前登录的用户名
  4. STM32实现一个HID键盘
  5. mysql 检查数据库是否损坏_mysql 检查数据库是否损坏
  6. angularjs实现行事历
  7. 卫星地图Google中国 可能是一项“要命的创新”
  8. typedef 函数类型 详解
  9. 一句话,大数据算法【更新ing】
  10. resize函数了解