为了账号安全,请及时绑定邮箱和手机立即绑定

未为数字 golang 设置位

未为数字 golang 设置位

Go
大话西游666 2021-09-27 17:30:03
我正在尝试在 golang 中解决项目euler问题 3:问题如下:13195 的质因数是 5、7、13 和 29。数 600851475143 的最大质因数是多少?我试图解决它如下:package mainimport (    "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。这个想法是我只需检查“素数”的第 4 位,看看它是否已设置。如果该位已设置,则它不是质数。对于小数字,代码似乎可以工作,但是当我开始测试诸如 100 之类的数字时,突然之间事情变得相当奇怪。我注意到在尝试将其设置为第 62 位时,位移位不起作用。以下跟踪可以演示这种情况:Current num: 48Bitset value is: 375299968947536Current num: 50Bitset value is: 1501199875790160Current num: 52Bitset value is: 6004799503160656Current num: 54Bitset value is: 24019198012642640Current num: 56Bitset value is: 96076792050570576Current num: 58Bitset value is: 384307168202282320Current num: 60Bitset value is: 1537228672809129296Current num: 62Bitset value is: 6148914691236517200Current num: 64Bitset value is: 6148914691236517200Current num: 66Bitset value is: 6148914691236517200Current num: 68Bitset value is: 6148914691236517200Current num: 70Bitset value is: 6148914691236517200Current num: 72Bitset value is: 6148914691236517200Current num: 74Bitset value is: 6148914691236517200Current num: 76Bitset value is: 6148914691236517200Current num: 78有人可以指出我执行位操作的方式可能有什么问题吗?
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

Go 编程语言规范

算术运算符

<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer

移位运算符将左操作数移位右操作数指定的移位计数。如果左操作数是有符号整数,则它们实现算术移位,如果它是无符号整数,则它们实现逻辑移位。班次计数没有上限。移位的行为就像左操作数被移位 n 次,移位计数为 n。

您正在从 64 位的末尾移出位:(1<<p)where 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


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信