将位设置为一个值,其中几个值的位都是相同的
Set bits to one where bits of several values are all the same?
为了检测x和y的位不同,可以使用 XOR
:
z = ~(x^y)
将将位设置为一个位置,其中x
和y
的位相等。
我想做同样的事情,但有两个以上的值:
template <typename T0, typename... TN>
constexpr T0 same(const T0 x0, const TN... xn)
{
// Something here
}
例如,对于4个值, same(x0, x1, x2, x3)
将返回一个掩码,其中一个位设置为一个位置,其中 x0
, x1
, x2
和 x3
的位均相等。如何做?
也许是这样的东西:
template <typename T0, typename... TN>
T0 same(const T0 x0, const TN... xn)
{
const int size = sizeof...(xn);
int res[] = {xn...};
T0 a1 = x0, a2 = ~x0;
for (int i = 1; i < size; ++i){
a1 &= res[i];
a2 &= ~res[i];
}
return a1 | a2;
}
same_bits = (x0 & x1 & ... & xn) | (~x1 & ~x2 & ... & ~xn))
z = (x0&x1&x2&x3) | (~x0&~x1&~x2&~x3);
//In first bracket, get all bits that are 1, in second - all that are zero.
~ ((x0 ^ x1) | (x0 ^ x2) | (x0 ^ x3) ... )
Xors留下一个零面向两个相等的位;当所有脸部相等时,OR离开零;不弯曲。
对于N
变量,操作计数为
N-1
XORS,N-2
ORS,1
不(总2N-2
)。
与其他使用的解决方案进行对比
2N-2
ands, 1
或, N
nots(总3N-1
)或
N-1
ands, N
ors, 1
不(总计 2N
)。
and_all(x0, x1...) | ~or_all(x0, x1...)
相关文章:
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何返回或护理项目清单基于几个类别
- 我们如何在文本文件中找到C++中的几个单词?
- 关于 std::bitset 构造函数的几个问题?
- 几个 Nt 函数在 Windows 7 x32 上返回STATUS_WAIT_0
- std::stoi 只转换前几个字符
- C++ 通过接口使用从其他几个类继承的类
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 我有几个关于参考变量的问题
- 如何将几个变量复制到其他变量
- 如何在新设计中迁移需要几个额外参数的函数
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 如何在几个空行后打印文件中的输出
- recvfrom 只收到几个数据包,之后它进入等待状态
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 将位设置为一个值,其中几个值的位都是相同的
- 我正在尝试设置几个不同的多维数组,但无法弄清楚为什么这不起作用