首页 > 解决方案 > C中~和&二元运算符的含义是什么

问题描述

我最近不得不在 c 中使用 sbrk() 函数,并且我必须计算我将用于在内存中分配空间的大小。经过一番研究,我发现了这行代码:

size_t calc_size = ((size) + ((4096) - 1)) & ~((4096) - 1);

尽管我搜索了解运算符“~”和“&”的含义,但我在 c 中的水平是平均水平,我找不到明确的解释,确切地说是 ~ 运算符。您能帮我了解正在执行的操作吗?

标签: c

解决方案


尽管我搜索了解运算符“~”和“&”的含义,

这些分别是按位 NOT 和按位 AND 运算符。它们与逻辑 NOT ( !) 和逻辑 AND ( &&) 的不同之处在于它们作用于每个单独的位(因此得名)。还有按位 OR ( |) 和 XOR ( ^) 运算符。例子:

int a = 0x5A;      // a = 01011010
int b = ~a;        // b = 10100101, i.e. bits of a inverted
int c = a & b;     // c = 00000000, i.e. bits of a and b ANDed together
int d = a | b;     // d = 11111111, i.e. bits of a and b ORed together
int e = a ^ 0x3D;  // e = 01100110, i.e. bits of a XORed with 00111100   

您能帮我了解正在执行的操作吗?

代码转换size为 4096 的倍数。该sbrk()函数调整分配给进程的内存量,4 KB 是典型的虚拟内存页面大小,因此以 4K 为增量增加内存是有意义的。这里的思路似乎是在request中加上4095 size,这样即使是1字节的请求也会提升为整个4096字节的块,然后去掉低位,这样就得到了4K的倍数。为了更好地理解这一点,请插入一些不同的值,size然后看看你得到了什么calc_size


推荐阅读