小编Pou*_*rko的帖子

Bash 中的按位运算未按预期工作

我遇到了一个奇怪的问题。为了演示,让我们取我机器上最大的无符号数(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向右移动一次将给出 …

bash arithmetic

12
推荐指数
2
解决办法
1001
查看次数

Kexec 到 GRUB(或到 Syslinux,或 Windows)

我有一个应用程序,我需要在其中启动到 Linux,执行自动化脚本,然后自动启动到 Windows。我可以使用 Kexec 来运行 grub 吗?

另一个用例是启动 Linux 内核以更新处理器微代码,然后kexec启动 GRUB 或 Syslinux 以启动 Windows——因为微代码在完全重启后将无法生存。

我听说过grub4dos链接(不可用)存档版本),但它似乎已停产,那么有没有办法用 GRUB2 做到这一点?

我基本上需要一个可加载的 GRUB 映像kexec。我试图加载在这个解释中找到的图像,但它们似乎不起作用。感谢您的任何提示。


注意:在 2014 年发现这篇文章,它说这尚未在 kexec 中实现。

grub boot grub2 kexec

9
推荐指数
1
解决办法
1243
查看次数

标签 统计

arithmetic ×1

bash ×1

boot ×1

grub ×1

grub2 ×1

kexec ×1