【问题标题】:SOLVED: How to analyze bytes of a variable's value in C已解决:如何在 C 中分析变量值的字节
【发布时间】:2022-06-23 17:17:47
【问题描述】:

是否可以将整数除以 n 位?

例如,由于int 变量的大小为 32 位(4 字节),是否可以将数字分成 4 个 8 位“片段”并将它们放入 4 个大小为 8 的其他变量中位?

编辑: 我解决了使用 unsigned char *pointer 指向我要分析字节的变量,如下所示:

int x = 10;
unsigned char *p = (unsigned char *) &x;
//Since my cpu is little endian I'll print bytes from the end
for(int i = sizeof(int) - 1; i >= 0; i--)
    //print hexadecimal bytes
    printf("%.2x ", p[i]);

【问题讨论】:

  • 如果您问如何将int 拆分为n 个字节,将会有很多骗子。请注意,尽管在 C 中 int 的大小没有明确定义。至于位操作本身,也许您需要查找“掩码”之类的内容,并遵循一些关于整数位操作的教程。
  • @MaartenBodewes 或者回答他的问题
  • @Fredrik 不,这不是这个问答网站的工作方式。我很高兴朝着正确的方向前进,但这个问题显然已经回答过很多次了,通过查看诸如<<&^ 等运算符在一个很好的教程中对提问者的帮助更大.
  • @Fredrik 尝试了一个解释性答案,但它仍然指向其他问题和 C 书籍。
  • 请添加解决方案作为答案并接受相同的答案,而不是编辑到问题中

标签: c binary bit


【解决方案1】:

是的,当然是。但通常我们只是使用为所有离散整数类型定义的bitwise operators 直接对位(称为bitops)使用位操作。

例如,如果您需要测试第 5 位最低有效位,您可以使用 x &= 1 << 4 来设置 x 以设置第 5 位,并将所有其他位设置为零。然后可以使用if (x)来测试是否已经设置; C 不使用boolean 类型,但假定零为假,任何其他值均表示真。如果您将1 << 4 存储到一个常量中,那么您已经为该特定位创建了一个"(bit) mask"

如果您需要一个值01,那么您可以使用另一种方式转换并使用x = (x >> 4) & 1。这在大多数 C 书籍中都有介绍,所以我恳请您在那里阅读这些位操作。


这里有很多关于如何将整数拆分为字节的 Q/A,参见例如here。原则上,您可以将它们存储在char 中,但如果您可能需要整数运算,那么您也可以将 int 拆分为多个值。一个问题是 int 刚刚定义为至少存储从 -32768 到 32767 的值。这意味着 int 中的字节数可以是 2 个字节或更多.


原则上也可以使用bit fields,但我会犹豫是否使用它们。使用int,您至少会知道这些位将存储在最低有效位中。

【讨论】:

  • 其实我是这样解决的:'int n = 2;无效 *p = &n;'因为 void *p 一次只能看到 1 个字节,所以如果我需要将 int 分成 4 块 8 位,我可以通过执行 *(p + 0) 来访问这些块以查看前 8 位,*( p + 1) 查看第二个 8 位,直到 p + 3,但我注意到它使用小端序,所以 *(p + 0) 实际上是最后 8 位,依此类推。还是谢谢
  • 你可能会从某人那里得到一些暗示,这不是可移植的,但是是的,对于字节,你可以使用指针算法。不过我不喜欢这样,使用变量(即寄存器)可能更快。
  • 你能举个例子吗?为什么它不能便携?
  • 我已经在答案中给出了示例,可移植性是因为 C int 的按位表示没有很好的定义。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多