草庐IT

算法篇之位运算

基本位运算:左移1位>>:右移1位~:按位取反&:有0就是0/全1才是1|:有1就是1^:相同为0,相异为1/无进位相加给一个数n,确定他的二进制中的第x位是0还是1(n>>x)&1前面的二进制&0全部变成0,所以决定答案是0还是1在于&1的是0还是1.将一个数n的二进制表示的第x位修改为1n|(1将一个数n的二进制表示的第x位修改为0n&(~(1提取出一个数n二进制表示的最右侧的1n&-n-n意味着将最右侧这个1的左边区域都取反那么右侧区域原本是1的变0,0变1经过&全变成0了,1右侧本来就全是0.干掉一个数n二进制表示的最右侧的1n&(n-1)n-1意味着将最右侧这个1的右边区域全部取反,

c++ - 按位读取缓冲区

我有一个缓冲区,其中包含一些具有不同位大小的数据(8位字段,然后是4位字段,然后是9位字段...)。我需要阅读它。如果有一些库允许使用位级别而不是字节级别的指针读取它,那就太好了。将缓冲区复制到结构不是一种选择,因为在研究之后我需要使用#pragmapack()或类似的东西,并且不可移植。有什么想法吗?编辑:我将尝试用一个例子来解释我的问题的严重性:field1:8bits-->ok,getfirstbytefield2:6bits-->ok,secondbyte,andamaskfield3:4bits-->getsharder,ihavetoget2bytes,apply2diff

c++ - 进程外内存堆可在32位地址空间内工作

问题:大型模拟游戏中有许多荒谬的不同对象,必须对其进行跟踪,更新并用于视觉渲染和逻辑模型更新。仅4GB的地址空间,您就只能在内存中容纳这么多东西。如果您求助于磁盘,除非运气好并且不断访问页面缓存,否则事情会开始放慢速度。但是即使那样,当文件系统同步到磁盘时,进行大量更新/写入也将是昂贵的。假设用户至少有32GB的RAM(少数报告有64GB),并且希望进行巨大的模拟,从而导致该模型所承载的数据量比游戏中要处理的大多数事物都要多一个数量级。它们当然具有64位操作系统(例如Windows7x64或Windows8x64)。自然地,如果仅将所有这些模型数据存储在进程中的虚拟地址空间中,即使使用

c++ - 将位解压缩为单精度 float 的最快方法

这是特定于平台的问题。速度至关重要。将一个字节解包到一个由8个单精度float组成的数组中以便零映射到零和一映射到一的最快方法是什么?我最终使用8位掩码和7位移位解压缩为8个int32,然后使用AVX指令将int32转换为float。我的平台是在支持AVX(但没有AVX2)的CPU上运行的Windows64位。编译器:VisualStudio2013。谢谢。 最佳答案 预处理不是更快吗?2^8的可能性已经差不多了,不过话又说回来,把它分成两部分,它只有2^4=16个变量。使数组包含16个“值”,其中每个值都是用4个具有正确值的flo

c++ - 将大类型的值分配给小类型时是否需要位掩码?

假设我想将uint32_t的低16位存储在Windows上的uint16_t中,我也可以这样做uint32_tvalue=123456789;uint16_tlow1=value;//likethisuint16_tlow2=value&0xFFFF;//orthis结果似乎没有区别,但我找不到任何文档明确说明这是已定义的行为。在X或Y情况下会有所不同吗?或者这就是它的工作原理? 最佳答案 C++标准保证无符号类型的赋值和初始化为您提供模2n的值,其中n是无符号类型的值表示中的位。在Windows中,所有位都参与值表示。因此,使用位

c++ - 位压缩结构

我目前正在做一个项目,我需要在vector中存储相当多(约数十亿个单位)的结构。我还需要以线性方式迭代该vector,因此我需要处理的数据越少越好。于是自然而然的开始优化单体结构的尺寸。例如,如果我有多个bool值,我可以将true/false值存储在一个位中,并将所有bool值压缩到一个char/16位中,无论大小是否足够。对于某些条目,我只需要20位无符号整数。因此我可以再次压缩这些值。然后我得到这样的结果(请注意,这只是简化的示例):classFoo{private:uint32_tm_time;uint32_tm_comb;public:Foo(uint32_tt,uint32

c++ - 从可能由不同线程修改的位集 (C++) 访问(读取)位是否安全

这种手术安全吗?(换句话说,如果位集在不同的线程上被修改,就没有机会读取一些虚假的中间值)?具体来说,我只对读取是否安全感兴趣,换句话说,我不问从两个单独的线程写入位集是否安全。例如:无论bs中的其他位是否同时被设置/清除,线程1是否会可靠地获取位5的当前状态?std::bitsetbs;//thread1:boolval;val=bs.test(5);//...//thread2://set/clearafewbitsbs.set(1);bs.set(3);bs.set(5);bs.reset(6);//... 最佳答案 以这种方

c++ - 如何以位字节序将数字转换为字节数组

我正在尝试使用zlibAPI解压缩在VB6中创建的一些数据。我读过qUncompress函数可以做到这一点:http://doc.trolltech.com/4.4/qbytearray.html#qUncompress我已经通过readRawBytes从QDataStream读取数据到一个char数组,然后我将其转换为QByteArray以进行解压。我具有压缩长度和预期的解压缩长度,但没有得到从qUncompress返回的任何内容。但是,我需要以大端格式在预期的解压缩长度前添加。有没有人这样做过并举个例子? 最佳答案 我很久没有使

c++ - C++ 中的位移位

我有以下结构:structSysData{//Topic(32bits)UTL_UINT16_TdefSystemID:11;//settodecimal25UTL_UINT16_TdefTypeID:5;//setto2(telemetrytype)UTL_UINT16_TdefContentID;//settodecimal1234}SysDataMsgHdr;MsgHdr.SystemID=25;MsgHdr.TypeID=2;MsgHdr.ContentID=0;如果我这样做:unsignedinta;memcpy(&a,&MsgHdr,sizeof(MsgHdr));head

c++ - unordered_map 使用什么位散列函数?

C++0x的unordered_map默认使用什么位散列?std::hash函数返回size_t。这是否意味着unordered_map使用16位哈希函数? 最佳答案 std::unordered_set默认使用std::hash。如果std::size_t对你来说是16位的,那么我猜它确实使用了16位哈希。在16位机器上,我希望unordered_map::max_size()足够低以至于使用这样一个弱散列不会有问题。 关于c++-unordered_map使用什么位散列函数?,我们在