gpt4 book ai didi

swift - 为什么我不能在 Swift 中使用位操作得到负数?

转载 作者:搜寻专家 更新时间:2023-11-01 07:22:05 24 4
gpt4 key购买 nike

这是一道 LeetCode 题。我在那个问题的不同版本中写了 4 个答案。当我尝试使用“位操作”时,出现错误。由于 LeetCode 中没有人可以回答我的问题,而且我找不到任何关于此的 Swift 文档。我想我会试着在这里问。

问题是获取给定数组中的多数元素 (>n/2)。以下代码适用于其他语言,例如 Java,因此我认为这可能是 Swift 中的一个一般性问题

func majorityElement(nums: [Int]) -> Int {
var bit = Array(count: 32, repeatedValue: 0)
for num in nums {
for i in 0..<32 {
if (num>>(31-i) & 1) == 1 {
bit[i] += 1
}
}
}
var ret = 0
for i in 0..<32 {
bit[i] = bit[i]>nums.count/2 ? 1 : 0
ret += bit[i] * (1<<(31-i))
}
return ret
}

当输入为[-2147483648]时,输出为2147483648。但在Java中,它可以成功输出正确的负数。

Swift 文档说:

Even on 32-bit platforms, Int can store any value between -2,147,483,648 and 2,147,483,647, and is large enough for many integer ranges.

嗯,它是2,147,483,647,输入比那个数字大1。当我在 Playground 上运行 pow(2.0, 31.0) 时,它显示 2147483648。我很困惑。我的代码有什么问题,或者我错过了关于 Swift Int 的什么?

最佳答案

Java int 是一个 32 位整数。 Swift Int 是 32 位或 64 位取决于平台。特别是,它在所有 OS X 上都是 64 位的支持 Swift 的平台。

您的代码只处理给定整数的低 32 位,因此

-2147483648 = 0xffffffff80000000

成为

2147483648 = 0x0000000080000000

所以解决这个问题,你可以改变函数以32位整数作为参数:

func majorityElement(nums: [Int32]) -> Int32 { ... }

或者通过计算实际大小并使用它代替常量 32:

func majorityElement(nums: [Int]) -> Int {
let numBits = sizeof(Int) * 8
var bit = Array(count: numBits, repeatedValue: 0)
for num in nums {
for i in 0..<numBits {
if (num>>(numBits-1-i) & 1) == 1 {
bit[i] += 1
}
}
}
var ret = 0
for i in 0..<numBits {
bit[i] = bit[i]>nums.count/2 ? 1 : 0
ret += bit[i] * (1<<(numBits-1-i))
}
return ret
}

一个更 Swifty 的方法是使用 map()reduce()

func majorityElement(nums: [Int]) -> Int {
let numBits = sizeof(Int) * 8
let bitCounts = (0 ..< numBits).map { i in
nums.reduce(0) { $0 + ($1 >> i) & 1 }
}
let major = (0 ..< numBits).reduce(0) {
$0 | (bitCounts[$1] > nums.count/2 ? 1 << $1 : 0)
}
return major
}

关于swift - 为什么我不能在 Swift 中使用位操作得到负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com