Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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++;位作为数字的列表_C++_Arrays_Math_Collections_Integer - Fatal编程技术网

C++ C++;位作为数字的列表

C++ C++;位作为数字的列表,c++,arrays,math,collections,integer,C++,Arrays,Math,Collections,Integer,例如,我希望有一个位列表,我可以在列表的某一部分上执行数学运算 value: 864 as bits, pos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 as bits, value: 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 如果我取位1到4和6到9,我得到0,1,1,0,1,0,0(104)。如果我加上3,它就会变成0,1,1,0,1,0,1,1(107) 我可以用一个std::vector和一个涉及位之间的逐位操作的过程

例如,我希望有一个位列表,我可以在列表的某一部分上执行数学运算

value: 864
as bits, pos:   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
as bits, value: 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0,  0
如果我取位1到4和6到9,我得到0,1,1,0,1,0,0(104)。如果我加上3,它就会变成0,1,1,0,1,0,1,1(107)

我可以用一个std::vector和一个涉及位之间的逐位操作的过程来实现这一点,如果(xor(data[n],data[n2]){data[n-1]==false;}等等,代码看起来就像这样

<>我甚至可以使用POD数组,但是我在想C++与计算机内部的关系往往是没有帮助的,但是在这里,它可以让这个操作非常迅速地完成。 类似于将值存储在一个大的POD变量或数组中,然后将它们复制到另一个变量的内存中,这样在再次将它们复制回存储中的位置之前,可以进行数学运算

甚至更好的是,例如加法运算符可以以某种方式将内存中的该位置作为参数,直接将加法执行到数据存储的中间?

听起来像是您想要的:


动态位集
类表示一组位。它通过
运算符[]
提供对单个位值的访问,并提供可以应用于内置整数的所有按位运算符,例如
运算符&
运算符可能的快速方法不起作用,而且会受到很大限制

unsigned int n = 8;
unsigned short *p1, *p2;
p1 = reinterpret_cast<unsigned short*>(&n);
p2 = reinterpret_cast<unsigned short*>((&n)+1);
std::cout<<*p1<<", "<<*p2<<std::endl;
无符号整数n=8;
无符号短*p1,*p2;
p1=重新解释铸件(&n);
p2=重新解释铸件(&n)+1;

std::coutIt听起来像是想要一个
int
!1到4和6到9(1,2,3,4,6,7,8,9)只是一个例子,它可以是我需要能够对其执行操作的任何段。我不确定我是否完全掌握了您想要的内容,但据我所知,您最好的选择是将数据复制到
int
或就地执行布尔逻辑。直接引用位数组的问题是数组中的特定位并不总是与字节的开头对齐。可能是@Tux-D的重复,而不是dup。他想在他的位数组的任意部分上做数学运算,而不是在单个位上。我想我更喜欢std::bitset,这是我以前不知道的。这似乎是一个类似的解决方案,但可能比使用bool数组更好。它似乎不允许我从位集中选择一个部分并对其执行操作,例如加法,尽管如果该部分长度超过1位,而不必将其复制到其他位置。我认为处理器无法对某些(复数)位执行任意操作。操作通常是在外部完成,然后隐藏回源代码。对不起,我自己写了一个完整的答案,但需要了解更多信息。
*pow(2,双(n-start))
。。。哦,天哪,不。问题是要有一个有效的解决方案!请随时用您自己的答案改进我的答案。
#include <math.h> // for pow in weighted_random_UINT
#include <bitset> // or std::vector<bool>

template <std::size_t T> // this line is not required with std::vector
unsigned int get_chunk(std::bitset<T>* btset, unsigned int start, unsigned int end)
{
    unsigned long out = 0;
    for(unsigned int n = start; n < end; n++)
    {
        out += unsigned long((*btset)[n] * pow(2,double(n-start)));
    }
    return out;
}

void main()
{
    // 6 bits of data in reverse order
    std::bitset<6> data (std::string("000110"));

    // all the data numerically
    std::cout<<get_chunk<6>(&data,0,5)<<std::endl;

    // the first 3 bits as a number
    std::cout<<get_chunk<6>(&data,0,2)<<std::endl;

    // the last 3 bits as a number
    std::cout<<get_chunk<6>(&data,3,5)<<std::endl;
}