gpt4 book ai didi

c - 仅当它为 0 时如何启用 octed 中的位?

转载 作者:太空狗 更新时间:2023-10-29 16:06:44 25 4
gpt4 key购买 nike

例如我有以下号码:

0x FF 00 FF

现在,我希望 00 部分只有在它为 0 时才为 1。我是否需要检查每个字节,或者是否有可以在这里使用的位技巧?

示例:

我有一个无符号长 IP,我用字符串函数对它进行哈希处理,但该函数终止于空字节,因此我需要将所有空字节设置为 1:

0x7F000001(127.0.0.1,可以是 0x0100007F 但无论如何取决于平台)

现在,我想将 0 字节变成 1:

0x7F010101(所以会变成127.1.1.1)

这是做我想做的唯一方法,这

char ip_sz[5];

*(unsigned long*)ip_sz = ulong_ip;

if (!ip_sz[0]) ip_sz[0] = 1;
if (!ip_sz[1]) ip_sz[1] = 1;
if (!ip_sz[2]) ip_sz[2] = 1;
if (!ip_sz[3]) ip_sz[3] = 1;

?

真的,好奇心。我不关心性能,因为我知道编译器无论如何都会优化它。

最佳答案

您可以通过应用位掩码(即在您希望检查的位置包含 1 而在所有其他位置包含零的数字)来检查整个字节是否为零*) 给它。

在您的情况下,您需要一个位掩码,在从零开始的位置 7 到 15(含)中包含八个连续的 1,即 0x00FF00。如果对掩码和数字 n 应用按位“AND”&,只有当 n 的所有位在位置 7 到 15 为零。否则,结果将是一些非零数。

int n = 0xFF00FF;
int mask = 0x00FF00;
if ((n & mask) == 0) {
... // Modify n as needed
}

您可以手动构造一个八位位掩码,或使用左移运算符,如下所示:

(0xFF)       // 0x000000FF
(0xFF << 8) // 0x0000FF00
(0xFF << 16) // 0x00FF0000
(0xFF << 24) // 0xFF000000

so, I would still have to do four if's?

在这种特定情况下,if 不是必需的,因为 C 中的一个小技巧:您可以使用 ! 将零转换为一,将任何其他数字转换为零.我将用一个字节来说明这一点;您可以使用移位将其扩展为整数。

uint8_t n = ... // Some value
n = n | (!n); // Here is the trick

最后一个操作将 0x00 转换为 0x01,而所有其他值(即 0x01 到 0xFF,含)保持不变 (demo)。

* 位掩码的构造取决于您对其应用的操作。对于“AND”和“XOR”,您将所需的位标记为 1,而对于“OR”,您将它们标记为 0。

关于c - 仅当它为 0 时如何启用 octed 中的位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com