【问题标题】:Bitwise or between 2 sets of bytes in c按位或在c中的2组字节之间
【发布时间】:2021-05-09 20:53:52
【问题描述】:

假设我们有

int *set1 = malloc(n);

int *set2 = malloc(n);

然后我们用数据填充这两个集合。我的目标是按位或在 set1 和 set2 之间执行。

我想我不能做类似的事情

for (i=0; i<n; i++) {
    set1[i] = set1[i] | set2[i];
}

因为 n 是字节数,而不是数组的单元数。

有什么想法吗?提前致谢

【问题讨论】:

  • n / sizeof(int)?
  • 通常情况下,您会使用 malloc(n * sizeof(int)) 然后 n 是数组中的元素数。
  • 是的,但是如果 n/sizeof(int) 是十进制数呢?
  • @Mark Tolonen 抱歉,它必须和我写的一样。
  • 那么n / sizeof(int)就是元素个数。假设 n 是一个整数,结果也是一个整数,并且是数组支持的整数个数。如果n 不是sizeof(int) 的倍数,则不会对剩余的奇数字节进行或运算。但如果你想这样,不要使用int

标签: c bitwise-or


【解决方案1】:
size_t elements = n / sizeof *set; 

for ( i = 0; i < elements; i++ )
  set1[i] = set1[i] | set2[i];

注意事项:

  • 表达式 *set1 的类型为int;因此表达式sizeof *set1sizeof (int) 相同。我更喜欢使用这样的表达式而不是显式命名类型;如果需要更改 set1 的类型,它会让事情变得更容易。

  • 如果n 是字节数,则n / sizeof *set1 是数组中int 元素的数量。请记住,在 C 中整数除法会产生整数结果 - 如果 n 不是 sizeof (int) 的倍数,那么结果将是 n / sizeof (int) 的底数 - 即 7/4 == 111/4 == 2 等。它还意味着您不会在该循环中访问最后几个字节;因为它们没有构成一个“完整的”int 对象,所以这不是一件坏事。

【讨论】:

    【解决方案2】:

    set1set2 是指向整数的指针。您尝试处理字节。这是不正确的。

    尝试想象一下内存布局:

    malloc(1) 将分配一个字节,即 8 位。 int *set1 声明了一个指向 int 的指针,通常为 4 个字节,即 32 位。

    char 通常代表 1 个字节,即 8 位。那么为什么不这样做呢,char *set1char *set2 呢?

    【讨论】:

    • 我正在做一个项目,我正在使用整数。我试图找到一种方法,以便不必更改我的整个代码,但如果没有其他方法,我将使用 char
    • 据我所知,没有其他办法。不幸的是,分配字节和使用整数指针首先是设计不当的。我希望我的例子能证明这一点。您冒着未定义行为的风险(在 C 中也称为 UB);用char数组代替int数组真的有这么大的变化吗?
    • 您可以听从 Mark 的建议,如果您使用整数指针,那么您将相应地分配整数类型:int *set1 = malloc(n * sizeof(int)) - 这会占用更多空间,但我的猜测是它可能不是真的对你来说很重要。它也应该可以正常工作。
    • 是的,我明白了。谢谢您的回答。我将其更改为字符。我在编程中做了很多其他更困难的事情,所以这会相对容易:P
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多