c++ - C/C++ : Bitwise operators on dynamically allocated memory

标签 c++ c bitwise-operators

在 C/C++ 中,是否有一种简单的方法可以将按位运算符(特别是左移/右移)应用于动态分配的内存?

例如,假设我这样做了:

unsigned char * bytes=new unsigned char[3];
bytes[0]=1;
bytes[1]=1;
bytes[2]=1;

我想要一种方法来做到这一点:

bytes>>=2;

(那么“字节”将具有以下值):

bytes[0]==0
bytes[1]==64
bytes[2]==64

为什么值应该是这样的:

分配后,字节如下所示:

[00000001][00000001][00000001]

但我希望将字节视为一长串位,如下所示:

[000000010000000100000001]

右移两位会导致这些位看起来像这样:

[000000000100000001000000]

当分成 3 个字节(因此是 0、64、64)时,最终看起来像这样:

[00000000][01000000][01000000]

有什么想法吗?我是否应该制作一个结构/类并重载适当的运算符?编辑:如果是这样,关于如何进行的任何提示?注意:我正在寻找一种方法(在一些指导下)自己实现它作为一种学习体验。

最佳答案

我假设您希望将位从一个字节传送到下一个字节,正如 John Knoeller 所建议的那样。

这里的要求是不够的。您需要指定相对于字节顺序的位顺序 - 当最低有效位超出一个字节时,转到下一个更高或下一个更低的字节。

不过,您所描述的内容过去在图形编程中很常见。您基本上已经描述了单色位图水平滚动算法。

假设“正确”意味着更高的地址但较低的有效位(即匹配两者的正常书写约定)单个位移位将类似于...

void scroll_right (unsigned char* p_Array, int p_Size)
{
  unsigned char orig_l = 0;
  unsigned char orig_r;

  unsigned char* dest = p_Array;

  while (p_Size > 0)
  {
    p_Size--;

    orig_r  = *p_Array++;
    *dest++ = (orig_l << 7) + (orig_r >> 1);

    orig_l = orig_r;
  }
}

为可变类次大小调整代码应该不是什么大问题。有明显的优化机会(例如一次处理 2、4 或 8 个字节),但我会把它留给你。

不过,要向左移动,您应该使用一个单独的循环,该循环应从最高地址开始并向下工作。

如果要“按需”扩展,请注意,orig_l 变量包含上面的最后一个字节。要检查溢出,请检查 (orig_l << 7) 是否非零。如果您的字节在 std::vector 中,则在任一端插入应该没有问题。

编辑 我应该说 - 优化一次处理 2、4 或 8 个字节会产生对齐问题。例如,当从未对齐的 char 数组中读取 2 字节的字时,最好先读取奇数字节,这样以后的字读取都是偶数地址,直到循环结束。

在 x86 上这不是必需的,但它要快得多。在某些处理器上,这是必要的。只需根据基址 (address & 1)、(address & 3) 或 (address & 7) 进行切换,以处理循环之前开头的前几个字节。您还需要对主循环之后的尾随字节进行特殊处理。

关于c++ - C/C++ : Bitwise operators on dynamically allocated memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394402/

相关文章:

C++ 预期主表达式错误

cat unix命令多线程实现

c - 为什么返回类型的存在使得不需要对参数进行前向声明?

java - 按位运算符意外行为

c - 使用位运算符将十进制转换为二进制

c++ - 在 C++ 中包装不同的 C API 实现

c++ - Node-Addon-Api 传递数组作为函数参数

c++ - c++程序中的数据库连接检查

c - XLIB C - 通过 PID 获取窗口

c - 使用 C 将整数值写入二进制文件