给定一个IntIntValue和一个bitPosition,如何将bitPosition的位设置为1或0?

问题描述

我试图了解Kotlin中的按位运算符。我有一个7位数字,想跟踪一周的7天以及每天浇水的那一天,每天由特定的位表示。

var Sunday = 0b1000000 ... var Saturday = 0b0000001

似乎在阅读Kotlin文档后,此功能会将一天(bitPosition)设置为1:

fun setDayEnabled(day: Int) {
    scheduledWeek = scheduledWeek.or(day)
}

Kotlin文档说到OR:“如果任一位为1,则为1”。但是我还没有找到一种方法专门将位设置为零。有办法吗?

我真正想要的只是说“对于给定的Int,将第4位位置设置为1或0”的功能。这似乎是一个非常简单的请求,但是我所寻找的似乎都不是按位运算符。我看到了另一个具有此功能的BitSet类,但是随后我看不到将BitSet转换为Int的方法,因此这看起来是错误的选择。我想念什么?

解决方法

您可以这样做:

var scheduledWeek = 0b0011000

fun setDayDisabled(dayMask: Int) {
    scheduledWeek = scheduledWeek and dayMask.inv()
}

fun main() {
    println(scheduledWeek)
    setDayDisabled(0b0010000)
    println(scheduledWeek)
}

此打印

24
8

如果要按索引执行此操作,则首先将掩码计算为:

dayMask = 1 shl dayIndex

索引应从0开始。

编辑:我对Kotlin不太熟悉,但是我只是意识到使用infix格式(例如,a or b而不是a.or(b))可能更惯用

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...