没有设置数字golang的位

时间:2015-04-06 22:01:59

标签: go bit-manipulation primes

我正在尝试在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'的unsigned int开始,初始值为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

有人可以通过我执行位操作的方式指出可能会有什么问题吗?

由于

1 个答案:

答案 0 :(得分:4)

  

The Go Programming Language Specification

     

Arithmetic operators

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

移位运算符将左操作数移位移位计数   由右操作数指定。如果,他们实施算术转移   左操作数是有符号整数,如果是,则逻辑移位   无符号整数。班次计数没有上限。转移   表现为好像左操作数被移位n次1   数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