Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一个聪明的方法来;“加倍”;整数中的位?_C++_Math_Binary - Fatal编程技术网

C++ 有没有一个聪明的方法来;“加倍”;整数中的位?

C++ 有没有一个聪明的方法来;“加倍”;整数中的位?,c++,math,binary,C++,Math,Binary,假设我有二进制数0b00110101 是否有一组简单的算术运算会产生0B000011100110011,其中第一个字的每一位都重复两次 存在这样一个简单的函数来重复第3位、第4位或第N位吗?我会做一个表格——这可能是最快的方法 您当然可以这样做: int doublebits(int x) { int y = 0; int bit = 0; while(x) { if (x & 1) y |= 3 <

假设我有二进制数
0b00110101

是否有一组简单的算术运算会产生
0B000011100110011
,其中第一个字的每一位都重复两次


存在这样一个简单的函数来重复第3位、第4位或第N位吗?

我会做一个表格——这可能是最快的方法

您当然可以这样做:

 int doublebits(int x)
 {
     int y = 0;
     int bit = 0;
     while(x)
     {
        if (x & 1)
            y |= 3 << bit;
        bit += 2;
        x >>= 1;
     }
     return y;
 }
int双位(int x)
{
int y=0;
int位=0;
while(x)
{
如果(x&1)
y |=3>=1;
}
返回y;
}

对于8位数字,最多向下移位8次,向右移位8次以生成新数字

好的,这次我相信找到了正确的顺序:

他们建议的一种生成方法是递归:

a(2n)=4a(n),a(2n+1)=4a(n)+3


这可不是什么小事。

请看一下此文档:

它描述了两个16位数字的交错,将其扩展到32位数字(这将创建一个64位数字)是相当简单的。您只需在一个额外的周期内继续该模式。像这样:

static const unsigned long long B[] = {
    0x5555555555555555,
    0x3333333333333333,
    0x0F0F0F0F0F0F0F0F,
    0x00FF00FF00FF00FF,
    0x0000FFFF0000FFFF
};
static const unsigned int S[] = {1, 2, 4, 8, 16};

unsigned long long x; // x must initially fit inside 32 bits
unsigned long long z; // z gets the result of x interleaved with itself

x = (x | (x << S[4])) & B[4];
x = (x | (x << S[3])) & B[3];
x = (x | (x << S[2])) & B[2];
x = (x | (x << S[1])) & B[1];
x = (x | (x << S[0])) & B[0];

z = x | (x << 1);
static const unsigned long long B[]{
0x55555555,
0x3333,
0x0F0F0F,
0x00FF00FF00FF00FF,
0x0000FFFF0000FFFF
};
静态常量无符号整数S[]={1,2,4,8,16};
无符号长x;//x最初必须适合32位
无符号长z;//z获取与自身交错的x的结果
x=(x |)(x看,这些技术似乎需要LUT或循环。因此,我认为最优雅的方法是在计算之前设置
y=x
时使用“明显方式”(链接)

unsigned short x;   // Interleave bits of x and y, so that all of the
unsigned short y;   // bits of x are in the even positions and y in the odd;
unsigned int z = 0; // z gets the resulting Morton Number.

x = INPUT_PATTERN;
y = x;

for (int i = 0; i < sizeof(x) * CHAR_BIT; i++) // unroll for more speed...
{
  z |= (x & 1U << i) << i | (y & 1U << i) << (i + 1);
}
无符号短x;//交错x和y的位,以便
无符号短y;//x的位在偶数位置,y在奇数位置;
unsigned int z=0;//z获取得到的莫顿数。
x=输入模式;
y=x;
对于(int i=0;iz |=(x&1U缺少查找表,我认为答案是:否。无论是隐式还是显式,您都需要解压输入字中的位。@Nate这只是写入二进制数并将其标记为二进制数的一种方法(类似于通常使用<代码> 0xOMW/COD>十六进制数的人。@内特:这是二进制文字,我相信C++支持。@马里奥OK,谢谢。我不熟悉我的坏。写你的程序并使用交织器。我不认为你需要在循环中使用if,只要逻辑上的转换就可以。d或者,至少在汇编程序中是这样。我写它是为了让它可读。如果你想要速度,就用这个函数生成一个表。[我不希望现代编译器,至少gcc和MS会生成一个分支]。
x>>1
是一个悬而未决的语句。你的意思是什么?修复了..谢谢你的发现[和缺少的空格!]可读性和聪明性不需要结合在一起。我同意表格解决方案速度更快,但非常难看。只进行位操作的东西会吸引汇编程序极客。我忘了回答你问题的第二部分,关于三份等。我相信同样的事情也适用,但在
B.现在有一个关于3值莫顿数的问题,这可能会有所帮助:这就是我怀疑存在的解决方案。谢谢!