使用Go对CPU ID进行位掩码转换

使用Go对CPU ID进行位掩码转换,第1张

使用Go对CPU ID进行位掩码转换

您要做的实际上

"1"
是从左至右输出二进制表示形式中的的索引,并从左侧开始计数(不常用)。

您可以使用位掩码和按位运算符来实现相同功能,而无需将其转换为二进制字符串。而且我将返回索引的一部分而不是其格式化的字符串,以便于使用。

要测试最低(最右边)的位是否为

1
,您可以像一样进行 *** 作
x&0x01 == 1
,然后将一个整数按位右移:
x >>=1
。移位后,最右边的位“消失”,先前的第二位变为第一位,因此您可以使用相同的逻辑再次进行测试。您可以循环播放直到该数字大于0(这意味着底数为1位)。

当然,如果我们测试最右边的位并向右移动,我们将获得 相反 的位(索引)(与所需值相比),并且索引从右开始计数,因此我们必须在返回结果之前对其进行更正。

因此,解决方案如下所示:

func getCpuIds(cpuMap string) (r []int) {    ci, err := strconv.ParseInt(cpuMap, 0, 64)    if err != nil {        panic(err)    }    count := 0    for ; ci > 0; count, ci = count+1, ci>>1 {        if ci&0x01 == 1 { r = append(r, count)        }    }    // Indices are from the right, correct it:    for i, v := range r {        r[i] = count - v - 1    }    // Result is in reverse order:    for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {        r[i], r[j] = r[j], r[i]    }    return}

输出(在Go Playground上尝试):

[0 2 24]

如果由于某种原因您需要将结果以逗号分隔

string
,则可以通过以下方式获得该结果:

buf := &bytes.Buffer{}for i, v := range cpuIds {    if i > 0 {        buf.WriteString(",")    }    buf.WriteString(strconv.Itoa(v))}cpuIdsStr := buf.String()fmt.Println(cpuIdsStr)

输出(在Go Playground上尝试):

0,2,24


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5639026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存