没有为数字 golang 设置位
Bits not being set for a number golang
我正在尝试用 golang 解决 project euler problem 3:
问题如下:
13195的质因数是5、7、13、29。
600851475143这个数的最大质因数是多少?
我正在尝试如下解决:
package main
import (
"fmt"
)
func primeset(n uint64) uint64 {
primes := uint64(0)
for p:= uint64(2);p <= n;p++ {
if((primes & (1 << p)) == 0){
fmt.Println("Current prime",p)
for j:=uint64(2)*p;j <=n;j=j+p {
fmt.Println("Current num:",j)
primes |= (1 << j)
fmt.Println("Bitset value is:",primes)
}
}
}
return primes
}
func main() {
n := uint64(100)
primes := primeset(n)
fmt.Println("Primes is",primes)
j := n
for j >= 2 {
s := primes & (1 << uint64(j))
if((s == 0) && ((n % j) == 0)){
fmt.Println("Largest factor",j)
return
} else {
j--
}
}
}
在函数 'primeset' 中,我从一个名为 'primes' 的无符号整数开始,初始值为 0,然后左移一个数字(它是一个复合数)并设置该位'primes' 到 1.
我的想法是,我只是检查'primes'的第4位,看看它是否已经设置。如果该位已设置,则它不是质数。
对于较小的数字,代码似乎可以工作,但是当我开始针对诸如 100 之类的数字对其进行测试时,突然间一切都变得很奇怪。
我注意到在尝试将位移位设置为第 62 位之后位移位不起作用。以下跟踪可以说明情况:
Current num: 48
Bitset value is: 375299968947536
Current num: 50
Bitset value is: 1501199875790160
Current num: 52
Bitset value is: 6004799503160656
Current num: 54
Bitset value is: 24019198012642640
Current num: 56
Bitset value is: 96076792050570576
Current num: 58
Bitset value is: 384307168202282320
Current num: 60
Bitset value is: 1537228672809129296
Current num: 62
Bitset value is: 6148914691236517200
Current num: 64
Bitset value is: 6148914691236517200
Current num: 66
Bitset value is: 6148914691236517200
Current num: 68
Bitset value is: 6148914691236517200
Current num: 70
Bitset value is: 6148914691236517200
Current num: 72
Bitset value is: 6148914691236517200
Current num: 74
Bitset value is: 6148914691236517200
Current num: 76
Bitset value is: 6148914691236517200
Current num: 78
Bitset value is: 6148914691236517200
Current num: 80
Bitset value is: 6148914691236517200
Current num: 82
Bitset value is: 6148914691236517200
Current num: 84
Bitset value is: 6148914691236517200
Current num: 86
Bitset value is: 6148914691236517200
有人可以指出我执行位操作的方式可能有什么问题吗?
谢谢
The Go Programming Language Specification
<< left shift integer << unsigned integer
>> right shift integer >> unsigned integer
The shift operators shift the left operand by the shift count
specified by the right operand. They implement arithmetic shifts if
the left operand is a signed integer and logical shifts if it is an
unsigned integer. There is no upper limit on the shift count. Shifts
behave as if the left operand is shifted n times by 1 for a shift
count of n.
您正在从 64 位的末尾移出位:(1<<p)
其中 p > 63
。例如,
package main
import (
"fmt"
)
func main() {
primes := ^uint64(0)
fmt.Println(primes)
for _, p := range []uint64{0, 1, 2, 62, 63, 64, 65, 99, 100} {
fmt.Println(p, "\t", primes&(1<<p))
}
}
输出:
18446744073709551615
0 1
1 2
2 4
62 4611686018427387904
63 9223372036854775808
64 0
65 0
99 0
100 0
我正在尝试用 golang 解决 project euler problem 3:
问题如下:
13195的质因数是5、7、13、29。 600851475143这个数的最大质因数是多少?
我正在尝试如下解决:
package main
import (
"fmt"
)
func primeset(n uint64) uint64 {
primes := uint64(0)
for p:= uint64(2);p <= n;p++ {
if((primes & (1 << p)) == 0){
fmt.Println("Current prime",p)
for j:=uint64(2)*p;j <=n;j=j+p {
fmt.Println("Current num:",j)
primes |= (1 << j)
fmt.Println("Bitset value is:",primes)
}
}
}
return primes
}
func main() {
n := uint64(100)
primes := primeset(n)
fmt.Println("Primes is",primes)
j := n
for j >= 2 {
s := primes & (1 << uint64(j))
if((s == 0) && ((n % j) == 0)){
fmt.Println("Largest factor",j)
return
} else {
j--
}
}
}
在函数 'primeset' 中,我从一个名为 'primes' 的无符号整数开始,初始值为 0,然后左移一个数字(它是一个复合数)并设置该位'primes' 到 1.
我的想法是,我只是检查'primes'的第4位,看看它是否已经设置。如果该位已设置,则它不是质数。
对于较小的数字,代码似乎可以工作,但是当我开始针对诸如 100 之类的数字对其进行测试时,突然间一切都变得很奇怪。
我注意到在尝试将位移位设置为第 62 位之后位移位不起作用。以下跟踪可以说明情况:
Current num: 48
Bitset value is: 375299968947536
Current num: 50
Bitset value is: 1501199875790160
Current num: 52
Bitset value is: 6004799503160656
Current num: 54
Bitset value is: 24019198012642640
Current num: 56
Bitset value is: 96076792050570576
Current num: 58
Bitset value is: 384307168202282320
Current num: 60
Bitset value is: 1537228672809129296
Current num: 62
Bitset value is: 6148914691236517200
Current num: 64
Bitset value is: 6148914691236517200
Current num: 66
Bitset value is: 6148914691236517200
Current num: 68
Bitset value is: 6148914691236517200
Current num: 70
Bitset value is: 6148914691236517200
Current num: 72
Bitset value is: 6148914691236517200
Current num: 74
Bitset value is: 6148914691236517200
Current num: 76
Bitset value is: 6148914691236517200
Current num: 78
Bitset value is: 6148914691236517200
Current num: 80
Bitset value is: 6148914691236517200
Current num: 82
Bitset value is: 6148914691236517200
Current num: 84
Bitset value is: 6148914691236517200
Current num: 86
Bitset value is: 6148914691236517200
有人可以指出我执行位操作的方式可能有什么问题吗?
谢谢
The Go Programming Language Specification
<< left shift integer << unsigned integer >> right shift integer >> unsigned integer
The shift operators shift the left operand by the shift count specified by the right operand. They implement arithmetic shifts if the left operand is a signed integer and logical shifts if it is an unsigned integer. There is no upper limit on the shift count. Shifts behave as if the left operand is shifted n times by 1 for a shift count of n.
您正在从 64 位的末尾移出位:(1<<p)
其中 p > 63
。例如,
package main
import (
"fmt"
)
func main() {
primes := ^uint64(0)
fmt.Println(primes)
for _, p := range []uint64{0, 1, 2, 62, 63, 64, 65, 99, 100} {
fmt.Println(p, "\t", primes&(1<<p))
}
}
输出:
18446744073709551615
0 1
1 2
2 4
62 4611686018427387904
63 9223372036854775808
64 0
65 0
99 0
100 0