c - a[0] = addr & 0xff 是什么意思?

标签 c arrays bit-manipulation

最近在看《the shellcoder's handbook》这本书,对c的理解很深,但是最近遇到一段代码,看不懂。

这是一段代码:

          char a[4];
          unsigned int addr = 0x0806d3b0;
          a[0] = addr & 0xff;
          a[1] = (addr & 0xff00) >> 8; 
          a[2] = (addr & 0xff0000) >> 16;
          a[3] = (addr) >> 24;

所以问题是这是做什么的,什么是 addr & 0xff(以及它下面的三行)以及是什么使 >> 8 成为它(我知道它将 8 除以 2)? Ps:如果您对我应该使用的标签有任何想法,请不要犹豫告诉我。

最佳答案

变量addr是 32 位数据,而数组中的每个元素 a是8位。代码所做的是复制 addr 的 32 位。进入数组 a , 一次一个字节。

让我们走这条线:

a[1] = (addr & 0xff00) >> 8; 

然后一步一步来。

  1. addr & 0xff00这将获取 addr 中值的第 8 位到第 15 位。 ,运算后的结果为0x0000d300 .
  2. >> 8这会将位向右移动,所以 0x0000d300变成 0x000000d3 .
  3. 将掩码和移位的结果值分配给a[1] .

关于c - a[0] = addr & 0xff 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33868998/

相关文章:

c++ - 操作结果未分配给变量?

algorithm - 很明显地找到一个 32 位数字的最高位集的索引,没有循环

C:链表迭代以段错误结束

javascript - 使用 .each 创建所有 .elems 找到的文本内容的数组

从 C 中的字符串中剪切子字符串

c# - 尝试 C# 将 Json 解析为带有内部数组的字典

c - 快速替换数组中元素的方法 - C

ios - 从 BLE 数据包中解压字节数组

有人可以解释\n、\b、\r 在 C 中的行为吗?

c - 尝试在 Ubuntu 中打开相对路径不起作用