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

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

Go 使用比位運算符返回除 java 腳本以外的其他總和

Go 使用比位運算符返回除 java 腳本以外的其他總和

Go
絕地無雙 2022-09-26 17:27:19
我試圖使用Go在JS中制作函數端口,但我遇到了奇怪的問題。函數的目標是對字符串中每個字母的 ascii 代碼求和。一切都很好,直到字符串長度<= 6之后,Go返回其他結果。原件來自 JSfunction c(e) { // e is string    var t = 0;     if (!e) // if e == ""       return t;     for (var n = 0; n < e.length; n++) {            t = (t << 5) - t + e.charCodeAt(n),            t &= t     }     return t}sdc("Google") // returns 2138589785c("Google1") // returns 1871773944戈伊港package mainimport (    "fmt")func main() {    fmt.Println(CountChars("Google")) // returns 2138589785    fmt.Println(CountChars("Google1")) // returns 66296283384}func CharCodeAt(s string) int {    return int([]rune(s)[0])}func CountChars(char string) int {    var sum int = 0    if char == "" {        return sum    }    for x:=0; x<len(char); x++ {        charToCode := string(char[x])        sum = (sum << 5) - sum + CharCodeAt(charToCode)        sum &= sum    }    return sum}去游樂場游戲代碼中的 JS 游樂場
查看完整描述

2 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

Javascript 中的整數是 32 位的,而 Go 的整數取決于體系結構,可能是 32 位和 64 位。它是 Go 游樂場上的 64 位。由于每次迭代向左移動 5,因此使用超過 6 個字符肯定會在 Javascript 中“溢出”(但在 Go 中尚未溢出):。int7*5=35 > 32 bits


使用顯式 32 位整數 () 來獲得與 Javascript 中相同的輸出:int32


func CountChars(char string) int32 {

    var sum int32 = 0

    if char == "" {

        return sum

    }

    for x := 0; x < len(char); x++ {

        sum = (sum << 5) - sum + int32(char[x])

        sum &= sum

    }

    return sum

}

這種方式的輸出將與Javascript的輸出相同(在Go游樂場上嘗試):


2138589785

1871773944

另請注意,Go 將字符串存儲為內存中的 UTF-8 字節序列,并為字符串(如 )編制索引,即 UTF-8 序列。這在您的示例中很好,因為所有輸入字符都使用單個字節進行編碼,但如果輸入包含多字節字符,您將獲得不同的結果。char[x]


要正確處理所有情況,請使用一個簡單的字符串:返回連續的符文,該符文也是 的別名,因此您可以獲得所需的代碼點。for rangeint32


此外,檢查空字符串是不必要的,如果它是空的,則不會執行循環主體。另外:這是一個沒有操作,只需刪除它。sum &= sum


簡化版本:


func CountChars(s string) (sum int32) {

    for _, r := range s {

        sum = (sum << 5) - sum + r

    }

    return

}

測試它:


fmt.Println(CountChars("Google 世界"))

將輸出與Javascript中相同的輸出(在Go游樂場上嘗試這個):


-815903459


查看完整回答
反對 回復 2022-09-26
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

這是一個大小問題。JS 整數是 32 位,而 Go 整數不一定是 32 位。如果依賴于特定的 int 大小,則應通過將 的實例替換為 來指定它。intint32


那是什么樣子的(游樂場):


package main


import (

    "fmt"

)


func main() {

    fmt.Println(CountChars("Google"))

    fmt.Println(CountChars("Google1"))

}


func CharCodeAt(s string, n int) int32 {

    return int32(s[n])

}


func CountChars(char string) int32 {

    var sum int32 = 0

    if char == "" {

        return sum

    }

    for x:=0; x<len(char); x++ {

        sum = (sum << 5) - sum + CharCodeAt(char, x)

        sum &= sum

    }

    return sum

}


查看完整回答
反對 回復 2022-09-26
  • 2 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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