c - C中~和&二元运算符的含义是什么
问题描述
我最近不得不在 c 中使用 sbrk() 函数,并且我必须计算我将用于在内存中分配空间的大小。经过一番研究,我发现了这行代码:
size_t calc_size = ((size) + ((4096) - 1)) & ~((4096) - 1);
尽管我搜索了解运算符“~”和“&”的含义,但我在 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
。
推荐阅读
- vue.js - Vue 组件错误:属性或方法 X 未在实例上定义,但在渲染期间引用
- r - R文本挖掘——去除特殊字符和引号
- azure-devops - 在 VSTS / Azure DevOps 中重置分支更新的构建策略
- multithreading - 使用 DatagramSocket Android 的线程运行方法和处理程序
- batch-file - 需要批处理命令获取 mac 地址并比较 txt 文件吗?
- vba - 显示访问报告列表框一个字段分为 3 列
- orchardcms - Pluralsight Advanced - 电影内容未显示在内容表中
- c - “ssize_t wb;”中变量名的命名约定
- mysql - 闭表插入查询
- python-3.x - 是否可以通过字节而不是宽度和高度来调整图像的大小?