Хитрая Go-задача:
package main
import "fmt"
type uint128 struct {
Hi uint64
Lo uint64
}
func f(φ uint128, β int) uint32 {
return uint32(φ.Hi >> (63 - β))
}
func main() {
x := uint128{Hi: 0x8000000000000001}
fmt.Println(f(x, 0))
fmt.Println(f(x, 1))
fmt.Println(f(x, 63))
}
Вопросы:
Что выведет код?
Что будет при β = 64?
Можно ли объявить одновременно beta и β?
Ожидаемый ответ:1
2
1
Подвох:
сдвиг зависит от β
возможен отрицательный shift
обрезание до uint32
beta и β - разные переменные
• Вам нужно понять, как работает сдвиг вправо
заметить, что в конце результат режется до uint32
• увидеть, что при β = 64 получится отрицательный сдвиг:
63 - 64 = -1
и ещё понять, что beta и β в Go - это разные имена переменных
То есть с виду задача про один shift, а на деле она проверяет сразу несколько знаний.
Запустить код:
https://go.dev/play/Полезные ресурсы Go 🚀
Max@golangtests