使用 awk 将小数点移动 9 位(不能使用 gawk lshift)

Shift a decimal by 9 bits with awk (can't use gawk lshift)

我需要将十进制数左移 9 位并以十六进制打印结果。

举个例子:

# Desired result:
perl -e "printf('%x', (99 << 9))"; echo;
c600

# Use case:
awk 'BEGIN{ d=99; printf("Decimal: %d, Hexadecimal: %x\n", d, d }'
Decimal: 99, Hexadecimal: 63 # Must be left shift by 9 (c600)

你能给我一个重现这个的方法吗?

不需要 awk,您可以在 bash 中使用 printf:

printf "%x\n" $((99 << 9))
c600

如果你必须使用 awk (gnu) 然后使用 lshift 函数:

awk 'BEGIN{printf "%x\n", lshift(99, 9)}'
c600

除非我们的精度有限,否则左移 9 等同于乘以 2^9=512:

$ awk 'BEGIN{ d=99; printf("Decimal: %d, Hexadecimal: %x\n", 512*d, 512*d) }'
Decimal: 50688, Hexadecimal: c600
$ awk 'BEGIN{ d=99; x=d*2^9; printf("Decimal: %d, Hexadecimal: %x\n", d, x )}'
Decimal: 99, Hexadecimal: c600