BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #1182同步于 2018/8/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

请教一个关于位操作的问题

limingji0503
2018/8/22镜像同步13 回复
最近在学习malloc.go的代码,没太理解下面的对其是怎么弄的。 ```go // Align tiny pointer for required (conservative) alignment. if size&7 == 0 { off = round(off, 8) } else if size&3 == 0 { off = round(off, 4) } else if size&1 == 0 { off = round(off, 2) } ``` 为什么满足 size&7 == 0 这个条件的就是 size > 8,将按照8B对齐呢? ```go for i := 1; i <= 16; i++ { if i&7 == 0 { fmt.Printf("%d:i&7 == 0\n", i) } else if i&3 == 0 { fmt.Printf("%d:i&3 == 0\n", i) } else if i&1 == 0 { fmt.Printf("%d:i&1 == 0\n", i) } } output: 2:i&1 == 0 4:i&3 == 0 6:i&1 == 0 8:i&7 == 0 10:i&1 == 0 12:i&3 == 0 14:i&1 == 0 16:i&7 == 0 ```
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Nroskill机器人#1 · 2018/8/22
x % (2^N) == x & (2^N - 1) 哈希表里常用的手段
Xiaoxb机器人#2 · 2018/8/22
?111 ?000 ?000
limingji0503机器人#3 · 2018/8/22
x % (2 ^N) == x & (2 ^N -1) 这个我懂, 但是我看好多人的翻译, ```golang if size&7 == 0 { off = round(off, 8) } ``` 的意思是大于8B的按照8B对齐,但是size&7==0的时候,size不就等于8或者16吗?size = 9. 10....15的时候size&7 也不等于0呐 【 在 Nroskill 的大作中提到: 】 : x % (2^N) == x & (2^N - 1) : 哈希表里常用的手段
limingji0503机器人#4 · 2018/8/22
嗯? 【 在 Xiaoxb 的大作中提到: 】 : ?111 : ?000 : ?000
Xiaoxb机器人#5 · 2018/8/23
首先,按8B对齐是啥意思 【 在 limingji0503 的大作中提到: 】 : x % (2 ^N) == x & (2 ^N -1) 这个我懂, : 但是我看好多人的翻译, : [md] : ...................
Nroskill机器人#6 · 2018/8/23
不懂go,但是我猜想默认情况下无需按照更大的位数对齐 按照你的逻辑,比如考虑极端情况,申请1G内存,要按照1 << 30对齐,但这样太浪费了,极端情况会浪费1<<30 - 1个字节 如果只到8,最多也就浪费7个字节 【 在 limingji0503 的大作中提到: 】 : x % (2 ^N) == x & (2 ^N -1) 这个我懂, : 但是我看好多人的翻译, : [md] : ...................
tonyjansan机器人#7 · 2018/8/23
round(off, 2^N)说得是将buffer pointer按照虚拟地址的坐标2的幂次对齐吧...没看到前边代码不太肯定,猜测offset值不一定指向2^N地址 【 在 limingji0503 的大作中提到: 】 : [md] : 最近在学习malloc.go的代码,没太理解下面的对其是怎么弄的。 : ```go : ...................
limingji0503机器人#8 · 2018/8/23
【 在 Nroskill 的大作中提到: 】 : 不懂go,但是我猜想默认情况下无需按照更大的位数对齐 : 按照你的逻辑,比如考虑极端情况,申请1G内存,要按照1 << 30对齐,但这样太浪费了,极端情况会浪费1<<30 - 1个字节 : 如果只到8,最多也就浪费7个字节 : ................... 的确会造成浪费。但go 只是对小对象(16B)以下的对象才这样进行分配。
limingji0503机器人#9 · 2018/8/23
不足8B 如7B,会在内存分配的时候占8B 【 在 Xiaoxb 的大作中提到: 】 : 首先,按8B对齐是啥意思 :