亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

未為數字 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 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號