按位或在 c 中的 2 组字节之间
Bitwise or between 2 sets of bytes in c
假设我们有
int *set1 = malloc(n);
int *set2 = malloc(n);
然后我们用数据填充这两个集合。我的目标是按位或在 set1 和 set2 之间执行。
我想我不能做类似
的事情
for (i=0; i<n; i++) {
set1[i] = set1[i] | set2[i];
}
因为 n 是字节数而不是数组的单元格数。
有什么想法吗?提前致谢
set1
和 set2
是指向整数的指针。您尝试处理字节。这是不正确的。
试着想象一下内存布局:
malloc(1)
将分配一个字节,即 8 位。
int *set1
声明一个指向 int 的指针,通常是 4 个字节,即 32 位。
一个char
一般表示1个字节,即8位。那么为什么不这样做呢,char *set1
和 char *set2
?
size_t elements = n / sizeof *set;
for ( i = 0; i < elements; i++ )
set1[i] = set1[i] | set2[i];
备注:
表达式 *set1
的类型为 int
;因此表达式 sizeof *set1
与 sizeof (int)
相同。我更喜欢使用这样的表达式而不是显式命名类型;如果 set1
的类型需要更改,它会让事情变得更容易。
如果n
是字节数,n / sizeof *set1
是数组中int
个元素的个数。请记住,在 C 中整数除法会产生一个整数结果 - 如果 n
不是 sizeof (int)
的倍数,那么结果将是 n / sizeof (int)
的底数 - 即 7/4 == 1
, 11/4 == 2
,等等。这也意味着您不会在该循环中访问最后几个字节;因为它们没有构成一个“完整的”int
对象,所以这不是一件坏事。
假设我们有
int *set1 = malloc(n);
int *set2 = malloc(n);
然后我们用数据填充这两个集合。我的目标是按位或在 set1 和 set2 之间执行。
我想我不能做类似
的事情for (i=0; i<n; i++) {
set1[i] = set1[i] | set2[i];
}
因为 n 是字节数而不是数组的单元格数。
有什么想法吗?提前致谢
set1
和 set2
是指向整数的指针。您尝试处理字节。这是不正确的。
试着想象一下内存布局:
malloc(1)
将分配一个字节,即 8 位。
int *set1
声明一个指向 int 的指针,通常是 4 个字节,即 32 位。
一个char
一般表示1个字节,即8位。那么为什么不这样做呢,char *set1
和 char *set2
?
size_t elements = n / sizeof *set;
for ( i = 0; i < elements; i++ )
set1[i] = set1[i] | set2[i];
备注:
表达式
*set1
的类型为int
;因此表达式sizeof *set1
与sizeof (int)
相同。我更喜欢使用这样的表达式而不是显式命名类型;如果set1
的类型需要更改,它会让事情变得更容易。如果
n
是字节数,n / sizeof *set1
是数组中int
个元素的个数。请记住,在 C 中整数除法会产生一个整数结果 - 如果n
不是sizeof (int)
的倍数,那么结果将是n / sizeof (int)
的底数 - 即7/4 == 1
,11/4 == 2
,等等。这也意味着您不会在该循环中访问最后几个字节;因为它们没有构成一个“完整的”int
对象,所以这不是一件坏事。