gpt4 book ai didi

c - int val=0xCAFE 测试最后四位中的至少三位 (LSB) 是否打开

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:58 25 4
gpt4 key购买 nike

我正在尝试自学 C。我遇到了这个练习,我正在学习以理解它。我已经阅读了有关屏蔽位的信息,为了获得最后四位,我们应该执行 val&0xF。我也阅读了这篇文章 What is Bit Masking? .我需要解释的部分是为什么可能的值是 0x7、0xB、0xD、0xE、0xF。我正在研究答案,并且阅读了各种文章。如果有人愿意向我解释这部分,我将不胜感激。

最佳答案

因为这些是所有可能的数字,最后四位中至少有三位是打开的。如果你记下从 0 到 15 的每个二进制数,你会发现它们至少设置了最后四位中的三位:

  • 0111 (0x7)
  • 1011 (0xB)
  • 1101 (0xD)
  • 1110 (0xE)
  • 1111 (0xF)

可以这样想:从 0 到 6 的每个二进制数最多设置 2 位:

  • 0 (0)
  • 1 (1)
  • 10 (2)
  • 11 (3)
  • 100 (4)
  • 101 (5)
  • 110 (6)

因此,它们都不符合规则。从 7 到 15,我们有:

  • 111 (7)
  • 1000 (8)
  • 1001 (9)
  • 1010 (10)
  • 1011 (11)
  • 1100 (12)
  • 1101 (13)
  • 1110 (14)
  • 1111 (15)

从这些中,只有 7、11、13、14 和 15 设置了最后四位中的三个。

这个方法很容易实现:

int chk_last_bits2(unsigned x) {
return ((x & 0x7) == 0x7) ||
((x & 0xB) == 0xB) ||
((x & 0xD) == 0xD) ||
((x & 0xE) == 0xE) ||
((x & 0xF) == 0xF);
}

请注意,我们必须明确测试每种情况下的相等性。例如,x & 0xB 将为每个设置了任何 1011 位的数字返回一个非零值。这不是我们想要的,我们希望它们都打开,这可以进行平等测试。

另一种可能的解决方案是:

int chk_last_bits(unsigned x) {
int i, j;
for (i = 1, j = 0; i < 32; i <<= 1)
if (i & x)
j++;
return j >= 3;
}

既然你正在学习 C,我会把这个留给你去尝试理解。

关于c - int val=0xCAFE 测试最后四位中的至少三位 (LSB) 是否打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758462/

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