Kotlin将数分解为2的幂

Kotlin将数分解为2的幂,kotlin,bit-shift,Kotlin,Bit Shift,嗨,我正在用kotlin编写一个应用程序,需要将一个数字分解为2的幂 我已经在c#、PHP和swift中完成了这项工作,但kotlin的工作方式有所不同 经过研究,我相信这与代码中的数字在某个地方变为负数有关,解决方法在于将一个或多个变量声明为“Long”,以防止这种情况发生,但我还没有弄清楚如何做到这一点 这是我的密码: var salads = StringBuilder() var value = 127 var j=0 while (j < 256)

嗨,我正在用kotlin编写一个应用程序,需要将一个数字分解为2的幂

我已经在c#、PHP和swift中完成了这项工作,但kotlin的工作方式有所不同

经过研究,我相信这与代码中的数字在某个地方变为负数有关,解决方法在于将一个或多个变量声明为“Long”,以防止这种情况发生,但我还没有弄清楚如何做到这一点

这是我的密码:

    var salads = StringBuilder()
    var value = 127
    var j=0
    while (j < 256) {

        var mask = 1 shl j
        if(value != 0 && mask != 0)  {

            salads.append(mask)
            salads.append(",")

        }
        j += 1
    }

    // salads = (salads.dropLast()) // removes the final ","
    println("Salads = $salads")

有什么想法吗?

不知何故,您希望对“value”和“mask”进行“按位AND”运算,以确定是否设置了“value”的第j位。我想你只是忘记了kotlin实现中的测试

这适用于您指定的一个输入,至少:

fun powersOfTwo(value :Long): String {

    val result = ArrayList<String>()

    var i = 0
    var lastMask = 0

    while (lastMask < value) {

        val mask = 1 shl i

        if (value != 0.toLong() && mask < value) {

            result.add(mask.toString())
        }

        lastMask = mask
        i += 1
    }

    return result.joinToString(",")
}

测试通过。

嗨,我终于设法让它正常工作了:

fun decomposeByTwo(value :Int): String {

val result = ArrayList<String>()
var value = value
var j = 0
while (j < 256) {

    var mask = 1 shl j
    if ((value and mask) != 0) {
        value -= mask
        result.add(mask.toString())

    }
    j += 1
}

return result.toString()
}
bun-decomposeByTwo(值:Int):字符串{
val result=ArrayList()
var值=价值
var j=0
而(j<256){
变量掩码=1 shl j
如果((值和掩码)!=0){
值-=掩码
result.add(mask.toString())
}
j+=1
}
返回result.toString()
}

我希望这能帮助那些试图掌握按位选项的人

您可以获得适合
Int
的所有二次幂的列表,并使用中缀函数
测试每个幂的值是否包含它:

val value = 126

val powersOfTwo = (0 until Int.SIZE_BITS).map { n -> 1 shl n }
println(powersOfTwo.filter { p -> value and p != 0}.joinToString(","))
// prints: 2,4,8,16,32,64

请参阅Kotlin Playerd中的完整代码:

这只适用于形式为2^n-1的输入值,其中n是整数。试试看,数值是129,而不是127。129的输入为
1,2,4,8,16,32,64128的输出。问题陈述并不表明我们关心剩余物。如果我们这样做,Drewby80将必须指定我们如何关心他们。Drewby80,您问了一个非常类似的问题,关于如何在swift中实现相同的功能。swift问题的解决方案将为所有非2^n-1形式的值提供与此kotlin实施方案截然不同的结果。请您将我的答案标记为“接受”好吗?您能澄清一下您想将数字分解为2的幂的意思吗。这是否意味着你想把数字写成2的幂和?或者您还有其他想法吗?我的系统存储在点击采集系统上为订购食物选择的选项,因为有许多选项可以以不同的组合进行配置,每个排列由幂2数字表示,即1、2、4、8、16、32等。这些代表沙拉,为订单选择的馅料酱选项等,一旦所有这些项目都被选中,它们将作为一个整数存储在数据库中,因此选择的莴苣-1黄瓜-4蛋黄酱-16将作为值20存储在数据库中,因此系统只需要一个字段作为整数来存储选项,而且性能很好(但我想你是指上面写了“20”的“21”,对吧?)。所以你想让你的新函数做的是接受值21并返回{1,4,16},21被“分解”成的2的幂。对吗?这就是“答案”对于您的swift问题,答案是正确的,但它不是kotlin函数的公认答案所做的。kotlin函数的公认答案只返回小于输入值的2的所有幂。如果值的形式为2^n-1,则此方法会起作用,而不是其他形式。即kotlin答案适用于输入127,而不是126或129.Oops是的21我现在发现我的工作解决方案如下,这可能不是最优雅的解决方案,但效果很好。如果你能建议对此进行改进,那就太好了!我还没有测试过,但它看起来应该会起作用。在我最初的回答中,我说你必须将价值和面具结合起来,以确定如果设置了值的第j位,则为ne,这就是您现在正在执行的操作。请注意,您没有理由一直测试到JAL,因此当j>32时,您的掩码计算(现在是这样)将为0。“1L shl j”应该适用于j<64。在每次迭代中,当你计算掩码时,添加一行打印出掩码和j的值,以进行调试。哇,在我为你解决问题后,你接受了自己的答案。很经典。是的,当然,假设没有你,我不可能做到。好奇为什么这被否决。这个建议是正确的,我这正是OP为使他的程序正常工作所做的。
fun decomposeByTwo(value :Int): String {

val result = ArrayList<String>()
var value = value
var j = 0
while (j < 256) {

    var mask = 1 shl j
    if ((value and mask) != 0) {
        value -= mask
        result.add(mask.toString())

    }
    j += 1
}

return result.toString()
}
val value = 126

val powersOfTwo = (0 until Int.SIZE_BITS).map { n -> 1 shl n }
println(powersOfTwo.filter { p -> value and p != 0}.joinToString(","))
// prints: 2,4,8,16,32,64