1 回答
TA贡献1846条经验 获得超7个赞
大小int取决于平台,可能是 32 位,也可能是 64 位。在 Go Playground 上它是 32 位的,在您的本地机器上它是 64 位的。
如果我们将您的示例更改为int64显式使用而不是int,则结果在Go Playground上也是相同的:
func findBySum(arr []int64) int64 {
result := int64(0)
sum := [32]int64{}
for i := int64(0); i < 32; i++ {
for _, v := range arr {
sum[i] += (v >> uint64(i)) & 0x1
}
sum[i] %= 3
sum[i] <<= uint(i)
result |= sum[i]
}
return result
}
func TestThree(t *testing.T) {
// except one nubmer,all other number appear three times
a1 := []int64{11, 222, 444, 444, 222, 11, 11, 17, -123, 222, -123, 444, -123} // unqiue number is 17
a2 := []int64{11, 222, 444, 444, 222, 11, 11, -17, -123, 222, -123, 444, -123} // unque number is -17
t.Log(findBySum(a1))
t.Log(findBySum(a2))
}
您执行假定 32 位整数大小的按位运算。要在本地获得正确的结果(您的体系结构以及 and 的大小int)uint,请将64-bit所有ints更改为int32and :uintuint32
func findBySum(arr []int32) int32 {
result := int32(0)
sum := [32]int32{}
for i := int32(0); i < 32; i++ {
for _, v := range arr {
sum[i] += (v >> uint32(i)) & 0x1
}
sum[i] %= 3
sum[i] <<= uint(i)
result |= sum[i]
}
return result
}
func TestThree(t *testing.T) {
// except one nubmer,all other number appear three times
a1 := []int32{11, 222, 444, 444, 222, 11, 11, 17, -123, 222, -123, 444, -123} // unqiue number is 17
a2 := []int32{11, 222, 444, 444, 222, 11, 11, -17, -123, 222, -123, 444, -123} // unque number is -17
t.Log(findBySum(a1))
t.Log(findBySum(a2))
}
教训:如果您执行的计算结果取决于表示大小,请始终保持明确,并使用固定大小的数字,如int32、int64、uint32、uint64。
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报