我遇到了一个奇怪的问题。为了演示,让我们取我机器上最大的无符号数(printf "%X \n" -1
给我FFFFFFFFFFFFFFFF
),并尝试移动一些位。?首先,向左移动:
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<4 ))
FFFFFFFFFFFFFFF0
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<8 ))
FFFFFFFFFFFFFF00
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<16 ))
FFFFFFFFFFFF0000
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。正如预期的那样。现在让我们尝试右移:
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>4 ))
FFFFFFFFFFFFFFFF
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>8 ))
FFFFFFFFFFFFFFFF
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>16 ))
FFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
等等,什么??为什么这不起作用?这是一个错误吗?
编辑:
我害怕有人会建议与提出的符号位有某种联系。但我们不是在谈论算术,所以符号的概念在这里没有立足之地。其他工具如*
和/
用于算术。拥有一个可以操作位的工具的全部意义在于能够操作位——无论我以后如何选择显示这些位,有符号还是无符号。对?喜欢:
printf "%u \n" -1
18446744073709551615
Run Code Online (Sandbox Code Playgroud)
有人有什么想法吗?
编辑:
由于这里的答案直接涉及乘法或除法,让我尝试更清楚地解释我的担忧。乘法/除法和位移位是两种不同的东西,尽管我可以在长期程序员的脑海中看到它们之间的联系。做算术的时候,必须要有符号的概念;对于位移,你没有。Bash 为我们提供了两种截然不同的工具集来处理这两种不同的事情。当我想将一个数字乘以 2 时,我会使用该*
工具。Bash 在底层可以使用位移进行算术这一事实超出了重点。
引用其中一个答案...
如果没有复制符号位,结果将变成无符号数。例如,将 8 位值
1111 0000
向右移动一次将给出 …
我有一个应用程序,我需要在其中启动到 Linux,执行自动化脚本,然后自动启动到 Windows。我可以使用 Kexec 来运行 grub 吗?
另一个用例是启动 Linux 内核以更新处理器微代码,然后kexec
启动 GRUB 或 Syslinux 以启动 Windows——因为微代码在完全重启后将无法生存。
我听说过grub4dos
(链接(不可用),存档版本),但它似乎已停产,那么有没有办法用 GRUB2 做到这一点?
我基本上需要一个可加载的 GRUB 映像kexec
。我试图加载在这个解释中找到的图像,但它们似乎不起作用。感谢您的任何提示。
注意:在 2014 年发现这篇文章,它说这尚未在 kexec 中实现。