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

如何在围棋中编写LEB128

如何在围棋中编写LEB128

Go
守候你守候我 2022-09-12 16:01:42
如何在 Go 中将整数写入 LEB128 格式?我正在尝试将 int32 编码为我的世界 VarInt,到目前为止,我已经尝试将 wiki 上的示例导入 Go。我在测试时得到了错误的结果,维基说-1应该等于[255 255 255 255 15],但我得到的是[255 255 255 255]。我在这里做错了什么?func WriteVarInt2(v int32) []byte{   var out []byte   c := 0   for{       currentByte := byte(v & 0b01111111)       v >>= 7       if v != 0 {           currentByte |= 0b10000000       }       out = append(out, currentByte)       c++       if c >= 5 || v == 0{           return out       }    }}
查看完整描述

1 回答

?
慕田峪4524236

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

问题在于移位操作。


>>是算术右移位,是逻辑右移位。不同之处在于,它带来了符号位(在左侧),而带来了零(无论符号位是什么)。>>>>>>>>


LEB128 的瓦林特算法使用逻辑移位,而 Go 的算法是算术移位。>>


Go中没有明显的逻辑偏移,但是如果您将数字视为无符号,您将得到确切的结果:


func WriteVarInt2(v_ int32) []byte {

    v := uint32(v_)


    // rest of your function unchanged

    // ...

}

测试它:


fmt.Println(WriteVarInt2(-1))

输出符合预期(在 Go 游乐场试用):


[255 255 255 255 15]


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号