【问题标题】:How do I make a bit mask that only masks certain parts (indices) of 32 bits?如何制作仅屏蔽 32 位的某些部分(索引)的位掩码?
【发布时间】:2018-02-14 08:36:32
【问题描述】:

我目前正在处理一项编程任务,其中我必须仅屏蔽整个 32 位数字的某个索引(例如:如果我将 8 个 4 位数字放入我的 32 位整数中,我将有 8 个每个索引有 4 位)。我希望能够仅打印整个 32 位中的一部分位,这可以通过屏蔽来完成。如果这些位只在一个地方,我不会有问题,因为我只会创建一个掩码,将 1 放在一个固定的位置(例如:00000000 00000000 00000000 00000001)。但是,我需要能够仅在一个索引中移动掩码以打印每个位(例如:我想用我的 0001 掩码循环通过第一个索引,每次将 1 向左移动,但我不想在之后继续该索引的第三位)。我知道我需要一个循环来完成这个;但是,我很难思考如何完成这部分作业。任何提示、建议或更正将不胜感激。另外,如果这很难理解,我很抱歉,但我找不到更好的表达方式。谢谢。

【问题讨论】:

  • 这是用什么语言写的? (C、C++、JavaScript、...)。一般来说,您可以结合 AND 掩码进行移位操作(0xabcd>>4 & 0xf 将给您 0x0c)。
  • 它在 C++ 中.....
  • 我想在移位的同时使用掩码和按位与运算符,但我只是对如何创建一个将随着我的输入更改位的掩码感到困惑。例如:如果我需要一个四位索引的掩码,我会制作 1111,但如果我需要一个两位索引的掩码,那么我必须制作 11。
  • 考虑按位左移运算符(或乘以 2)

标签: c++ bit-shift bits bitmask


【解决方案1】:

首先是关于代表性。您需要二进制数来表示位和掩码。至少在 c++14 之前,没有直接用 c/c++ 语言实现的二进制文件。因此,在 c++14 之前,您必须使用十六进制或八进制来表示您的二进制文件,即

0000 1111 == 0x0F
1111 1010 == 0xFA

从 c++14 开始你可以使用

0b00001111;

现在,如果您将二进制掩码向左或向右移动,您将获得以下图片

00001111 (OxF) << 2 ==> 00111100 (0x3C)
00001111 (0xF) >> 2 ==> 00000011 (0x03)

现在,假设您有一个您对位 4 到 7(4 位)感兴趣的数字

int bad = 0x0BAD; // == 0000 1011 1010 1101

你可以创建一个面具为

int mask = 0x00F0; // == 0000 0000 1111 00000

按位执行and

int result = bad & mask; // ==> 0000 0000 1010 000 (0x00A0)

您将屏蔽字中间的 4 位,但它会打印为 0xA0。可能不是你所期望的。要将其打印为 0xA,您需要将结果右移 4 位:result &gt;&gt; 4。我更喜欢以不同的顺序来做,先转移“坏”,然后再做掩码:

int result = (bad >> 4) & 0xF;

希望以上内容能帮助你理解比特。

【讨论】:

  • 好的,我有一个简单的问题:我可以或不可以使用按位和常规整数吗?例如,假设 9 是索引 3 中的输入,我还能在 9 和掩码之间使用按位和吗? (1111) 或者,我是否需要先将 9 转换为二进制然后使用位掩码?谢谢
  • 我不明白您在这种情况下对索引的含义。请定义它的含义。任何数量的任何面额都只是一组比特。十进制“9”与十六进制“9”相同,与八进制“11”相同,与二进制“1001”相同。
  • 我将整数值放入一个 32 位整数 x 中。我从用户那里获取一个 k 值,告诉我他们将输入多少个值(例如:k = 4)。因此,用户将输入四个值(例如:4、15、8、2)。这些数字中的每一个都需要占用 8 位,总共 32 位。我必须将位划分为索引,例如 4 在索引 3 中,15 在索引 2 中,依此类推。我感到困惑的是:如果用户输入 16 个 k 值,那么这些位将必须在每个索引 (32/k) 中分成 2 位,在这种情况下,我必须有一个带有 30 个 0 的掩码和两个 1。
  • @Programme 所以,你只需要屏蔽 2 位。你的面具看起来像这样0000...0011 (0х3)。你有什么困惑?您可以使用 1 到 32 范围内的任意位数的掩码。好吧,根据您的描述,如果每个索引使用 2 位,那么您可以放入其中的数字是 0、1、2 和 3 . 更大的数字没有位空间。如果你使用 4 位,那么你可以容纳 0..15,6 位会给你 0..63 等等。
  • 在困惑了几个小时之后,我最终以自己奇怪的方式解决了这个问题。不过,这确实有助于完全澄清。谢谢!我很感激。如果你经常想太多事情,有时可能很难把注意力集中在事情上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2020-02-08
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多