草庐IT

整数二分

全部标签

如何将未签名的16和未签名的32位整数编码为未签名的8位内存数组?

我知道如何进行一点转移,但是我的价值似乎从边缘流行,我失去了原始价值,以换取保留8位。看答案对于未签名的16位整数:unsignedshortval16=0x1234;unsignedcharenc[2];enc[0]=val16&0xff;//stores0x34toenc[0]enc[1]=val16>>8&0xff;//stores0x12toenc[1]对于未签名的32位整数:unsignedintval32=0x12345678;unsignedcharenc[4];enc[0]=val32&0xff;//stores0x78toenc[0]enc[1]=val32>>8&0xff;

c++ - AVX 将 64 位整数转换为 64 位 float

我想使用AVX将4个打包的64位整数转换为4个打包的64位float。我试过类似的东西:int_64t*ls=(int64_t*)_mm_malloc(256,32);ls[0]=a;//...ls[3]=d;__mm256ipacked=_mm256_load_si256((__m256iconst*)ls);将在调试器中显示:(gdb)printpacked$4={1234,5678,9012,3456}到目前为止还好,但我能找到的唯一转换/转换操作是_mm256i_castsi256_pd,它无法满足我的要求:__m256dpd=_mm256_castsi256_pd(packe

c++ - 二分查找,排序数组

我正在学习二分查找,基本定义是从指向第一个元素的迭代器和指向最后一个元素的迭代器开始的。您还有一把key,它就是您要查找的元素。首先将键与中点的值进行比较,然后根据键是大于还是小于中点的值来消除上半部分或下半部分。这个过程一直持续到匹配为止。此方法是否需要对您正在查看的容器进行排序?否则,我看不出容器中的键和值之间的比较有何特殊用途,以消除要查看的容器部分。 最佳答案 是的,确实如此。Incomputerscience,abinarysearchorhalf-intervalsearchalgorithmfindsthepositi

c++ - 从 std::string 中提取整数

我正在编写简单的OBJ加载器,我遇到了下一个问题-我必须从下一个std::string中提取整数:fv0/vt0/vn0v1/vt1/vn0...vk/vtk/vnk其中vk、vtk、vnk都是int值,/和值之间没有空格组与组之间只有一个空格。由于文件可能非常大,而且这种类型的行可能出现超过100000次,我需要一种有效的方法来从像这样的字符串中提取整数。编辑:正如Jesse所问,这是我目前的方法(我假设数据格式正确!):intp,t,n;constchar*l=line.c_str()+2;for(intvIndex=0;l&&sscanf(l,"%d/%d/%d",&p,&t,&

c++ - 如何在 C++ 中将 64 位整数乘以分数同时最小化错误?

这个问题在这里已经有了答案:Mostaccuratewaytodoacombinedmultiply-and-divideoperationin64-bit?(12个答案)关闭8年前。给定一个64位(有符号)longlong或__int64,您将如何将它乘以任意分数,同时最大程度地减少错误?三个简单的草图:int64_tnumerator=...;int64_tdenominator=...;int64_tx=...;//a,lossydoubleconversionforlargevaluesdoublefraction=static_cast(numerator)/static_c

c++ - 带有整数参数的 std::pow,与整数类型进行比较

根据http://en.cppreference.com/w/cpp/numeric/math/pow,当std::pow与整数参数一起使用时,结果被提升为double。我的问题如下:将整数类型与std::pow(int1,int2)的结果进行比较有多安全?例如,下面的if可以计算为true吗?std::size_tn=1024;if(n!=std::pow(2,10))cout也就是说,rhs上的结果是否可能类似于1023.99...9,所以当转换为size_t时变成1023?我的猜测是,答案是一个大大的“否”,但想确定一下。我在检查矩阵等的维数时使用这些类型的比较,我不想在任何地方

c++ - 测试 AVX 寄存器是否包含一些相等的整数

考虑一个包含四个64位整数的256位寄存器。是否有可能在AVX/AVX2中有效地测试其中一些整数是否相等?例如:a){43,17,25,8}:结果必须是false因为4个数字中没有2个是相等的。b){47,17,23,17}:结果必须为“真”,因为编号17在AVXvector寄存器中出现2次。如果可能的话,我想在C++中执行此操作,但如有必要,我可以转到汇编。 最佳答案 对于AVX512(AVX512VL+AVX512CD),您将使用VPCONFLICTQ,专为此目的而设计。对于AVX2:通过减少冗余比较减少了一些操作:inttes

c++ - 如何输出带有正号和前面零的整数

我希望一个数字显示为一个正号和前面的三个0,但我目前得到的是000+1,而我想要的是+0001#include#includeusingnamespacestd;intmain(void){intnumber=1;cout 最佳答案 您还需要设置std::internal旗帜。这样您将获得预期的+0001-testatideone. 关于c++-如何输出带有正号和前面零的整数,我们在StackOverflow上找到一个类似的问题: https://stacko

c++ - C++中字符和整数数组的不同行为

这是一个用C++编写的小代码,其中我分别创建了两个char和int数据类型的数组。但是,对于这两个数组,相同的打印操作表现不同#includeusingnamespacestd;intmain(){chara[5]={'h','e','l','l','o'};intb[5]={1,2,3,4,5};cout我希望输出是两个数组的第一个元素的地址,即分别是a[0]和b[0]的地址,但是在这种情况下char类型数组的行为不同。 最佳答案 这是cout的运算符char*参数视为空终止字符串并打印整个字符串。如果要打印地址,请将其转换为vo

c++ - 没有 AVX2 的 32 位整数的 SSE 整数 2^n 次幂

我找不到用于计算2^n的SSE指令对于vector__m128i32位整数。是否有执行以下伪代码的指令或函数?__m128ipower_of_two(__m128ib){__m128r;for(inti=0;i_mm_sll_epi32指令只计算r[i]=a[i]. 最佳答案 AVX2之前没有单一指令,但即使只有SSE2,也有一个技巧可以滥用浮点格式来生成2的幂,方法是使用整数算法生成指数字段,然后将其从float转换为整数.可能有更快的选择。__m128ipower_of_two(__m128ib){__m128iexp=_mm_