Golang中函数转换的实现方法求助

Golang中函数转换的实现方法求助 有人能帮我把这个Java函数转换成Go语言吗?

public long complementOfTo(String hex){
        
        HexToBin hextobin = new HexToBin();
        long coord = 0;
        int a = Integer.parseInt(String.valueOf(hextobin.hexToBin(hex).charAt(0)));
        switch (a){
            case 0:
                coord = Long.parseLong(hex,16);
                break;
            case 1:
                long c = Long.parseLong(hex,16);
                long r = c ^ (long)(Math.pow(2, Math.ceil(Math.log(c)/Math.log(2))) -1);
                coord = Long.parseLong("-".concat(String.valueOf(r)));
                break;
        }
        return coord;
}

非常感谢任何帮助。谢谢。


更多关于Golang中函数转换的实现方法求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

如果您熟悉Go语言,这个函数的大部分内容转换起来应该相当直接。您在代码的哪个部分遇到了困难?

更多关于Golang中函数转换的实现方法求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


将数字转换为字符串然后再转换回负整数的有趣代码行 😛

switch case 获取十六进制转二进制的第一个字符并将其转换为整数,其实你完全可以直接对第一个字符进行 switch 判断。

HexToBin() 将十六进制数字转换为二进制,如果第一位是零,我猜它会填充到特定宽度。是多少位呢?

我可能理解有误,但这个函数的功能是将字符串中的十六进制数字转换为补码数(计算机中最常见的有符号整数表示方式)

package main

import (
	"fmt"
	"strconv"
)

func complementOfTwo(hex string) int64 {
	coord, _ := strconv.ParseUint(hex, 16, 64)
	return (int64)(coord)
}

func main() {
	fmt.Println(complementOfTwo("0000000000000001")) //  1
	fmt.Println(complementOfTwo("ffffffffffffffff")) //  -1
}

以下是您提供的Java函数转换为Go语言的实现。由于Java代码中使用了自定义的HexToBin类,而Go标准库中没有直接等效的功能,我将假设hexToBin方法的作用是将十六进制字符串转换为二进制字符串,并提取第一个字符。在Go中,我们可以使用标准库函数来处理十六进制和二进制转换,并实现相同的逻辑。

Go语言实现如下:

package main

import (
	"fmt"
	"math"
	"strconv"
	"strings"
)

// 假设 hexToBin 函数将十六进制字符串转换为二进制字符串
// 这里我们实现一个简单的版本:将十六进制字符串解析为整数,然后格式化为二进制字符串
func hexToBin(hex string) string {
	// 将十六进制字符串解析为uint64
	val, err := strconv.ParseUint(hex, 16, 64)
	if err != nil {
		// 处理错误,这里简单返回空字符串
		return ""
	}
	// 计算二进制字符串,使用64位宽度
	binStr := fmt.Sprintf("%064b", val)
	return binStr
}

func complementOfTo(hex string) int64 {
	binStr := hexToBin(hex)
	if len(binStr) == 0 {
		return 0 // 如果转换失败,返回0
	}
	// 获取二进制字符串的第一个字符(最高位)
	firstChar := binStr[0]
	var coord int64

	// 将字符转换为整数:'0' -> 0, '1' -> 1
	a := int(firstChar - '0')
	switch a {
	case 0:
		// 如果最高位是0,直接解析为无符号长整型,然后转换为int64
		val, err := strconv.ParseUint(hex, 16, 64)
		if err != nil {
			return 0
		}
		coord = int64(val)
	case 1:
		// 如果最高位是1,计算补码
		val, err := strconv.ParseUint(hex, 16, 64)
		if err != nil {
			return 0
		}
		c := int64(val)
		// 计算掩码:2^ceil(log2(c)) - 1
		// 注意:如果c为0,log2(0)未定义,这里需处理c=0的情况
		if c == 0 {
			coord = 0
		} else {
			// 计算对数并向上取整
			logVal := math.Log2(float64(c))
			ceilLog := math.Ceil(logVal)
			mask := int64(math.Pow(2, ceilLog)) - 1
			// 异或操作得到补码
			r := c ^ mask
			// 转换为负数
			coord = -r
		}
	}
	return coord
}

func main() {
	// 测试示例
	hexStr := "FF" // 示例十六进制字符串
	result := complementOfTo(hexStr)
	fmt.Printf("补码结果: %d\n", result)
}

代码说明:

  1. hexToBin函数:将十六进制字符串转换为64位二进制字符串。使用strconv.ParseUint解析十六进制,然后使用fmt.Sprintf格式化为二进制字符串,填充前导零至64位。
  2. complementOfTo函数
    • 解析二进制字符串的第一个字符(最高位),判断是0还是1。
    • 如果最高位是0,直接解析十六进制字符串为int64
    • 如果最高位是1,计算数值的补码:
      • 使用对数计算掩码大小:ceil(log2(c)),然后生成掩码mask = 2^ceilLog - 1
      • 通过异或操作c ^ mask得到补码值,并转换为负数。
  3. 错误处理:在解析十六进制字符串时,如果出错,函数返回0。在实际应用中,您可能需要更详细的错误处理。
  4. 测试部分:在main函数中提供了一个简单测试,使用十六进制字符串"FF"调用函数并打印结果。

注意:原始Java代码中使用了long类型,在Go中我们使用int64来匹配。如果输入十六进制字符串表示的值超出int64范围,可能需要调整类型为uint64或处理大数。此实现基于您提供的逻辑,但假设二进制字符串为64位。如果您的应用场景不同,请调整hexToBin函数中的位宽。

回到顶部