【问题标题】:C - How to check if 8 bits are in 32 bit?C - 如何检查 8 位是否为 32 位?
【发布时间】:2016-02-02 08:09:00
【问题描述】:

我想检查 char 中的 8 位是否是 int 的 32 位的子字符串。

a = 0110 1010 1011 0100 0000 0110 1010 0010 (32 bit int)
b = 0100 0000 (8 bit char)

is_in(a, b) --> true

这是我的代码:

    for (int i = 0; i < 25; i++) {
       int tmp = a;
       tmp <<= 24;
       tmp >>= 24;
       int res = b ^ tmp;
       res <<= 24;
       res >>= 24;
       if (res == 0)
          return 1;
       else
          a >>= 1;
    }
    return 0;

我希望它更有效率。 有什么想法吗?

【问题讨论】:

  • b 可以在a 中的任何位置,还是仅在字节边界上?到目前为止,您尝试过什么?您的代码遇到了什么问题?
  • 关键字:移位、屏蔽和比较。使用&lt;&lt;&gt;&gt; 运算符和&amp; 运算符。提出解决方案,然后在遇到困难时提出问题。
  • 如果 8 位只能在 32 位 int 的确定位置上,您可以使用 AND 操作将所有其他位归零并直接比较值。
  • 8 位可以是 32 位中的任何位置,我用我的代码更新了问题。
  • 如果代码确实按预期工作,它可能更适合Code Review

标签: c char int bit-manipulation bitwise-operators


【解决方案1】:

嗯,你可以试试……

bool is_in(uint32_t a, uint8_t b) {
  while (a >= b) {
    if ((a & 0xff) == b) return true;
    a >>= 1;
  }
  return false;
}

【讨论】:

  • 赞成对两个参数使用unsigned,否则你最终会被移入1。
  • 显而易见的解决方案。
  • 否决使用未指定的宽度类型。不能保证 unsigned 将有 32 位。使用stdint.h 类型!
  • 我认为这在某些情况下会失败,例如a = 0x000000ffb = 0xffa = 0x0000ff00b = 0xff。大体思路不错,但bug需要修复。
  • a 等于bwhile(a &gt; b) 将失败,这是您要检测的情况的子集,即当b 是最重要的非a 的零子串。这应该是while(a &gt;= b) 以涵盖@PaulR 突出显示的案例。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多