最好的方法是定义一个掩码
the best way define a mask
我写了一个函数,它应该从unsigned int
中提取不同的比特集。我想用一个面具。我不确定定义这种掩模的最好方法是什么。例如,我需要提取比特6:14。所以我需要定义一个遮罩为111111111 << 6
。我的问题是我不能使用boost或类似的东西,标准c/c++不知道用二进制数工作。可能的做法是把111111111写成2^10-1。我不确定——这是最好的(最优雅的)解决方案。任何建议吗?
大多数人在表示掩码时使用十六进制,例如0xFF, 0x0A等
让我们先试着做一堆1。
N个1的二进制序列的一个性质是,就像一个9的十进制序列一样,如果你给它加1,你会得到一个1后面跟着N个0。我们可以用逆运算,如果你用一个1减去1,后面跟着N个0,就得到一个N个1的序列,来做这个。
1后面跟着N个0只是右移了N个位置
template <typename Uint>
Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html
return 1 << n - 1; // same as 2^n - 1 :)
}
有了任意长度的zigamorphs,你现在可以很容易地从任何值中获得你想要的位,通过按位和。
template <typename Uint>
Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive?
return value & zigamorph<Uint>(last_bit-first_bit+1);
}
只要用0x1FF << 6
(如果你想要111111111 << 6
)或0x3FF
<< 6
(如果你想要2^10-1 <<这就清楚多了而不是二进制。正如杰里·科芬所指出的,你可以很容易地做到通过使用1 << 10
得到2^10,但我不相信这是比只用十六进制更清楚。(就此而言,在某些情况下,0x7FC00
可能非常清楚。它有好处是你可以直观地看到比特的位置在这个世界上,如果你有一个魔咒,就更容易把它们挑出来转储)。
您可以访问标准库吗?如果是这样,我会尝试std::bitset
这是它的文档。
相关文章:
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- OpenCV 检测带有掩码的斑点
- 用C++中的一个数字和一个位掩码生成一个数字数组
- 从两个 cv::垫子和一个掩码构建 cv::垫子
- 最好的方法是定义一个掩码