首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C语言中,0x01和0x80代表的是什么位运算?

在C语言中,0x01和0x80代表的是什么位运算?
EN

Stack Overflow用户
提问于 2010-04-18 07:30:31
回答 4查看 22.7K关注 0票数 8

我正在尝试颠倒C中的位顺序(家庭作业问题,主题:按位运算符)。我找到了this解决方案,但我对使用的十六进制值-- 0x01和0x80感到有点困惑。

代码语言:javascript
复制
  unsigned char reverse(unsigned char c) {
     int shift;
     unsigned char result = 0;

     for (shift = 0; shift < CHAR_BITS; shift++) {
        if (c & (0x01 << shift))
            result |= (0x80 >> shift);
     }
     return result;
  }

我正在编写的book没有讨论过这些类型的值,所以我真的不确定该如何理解它们。有人能解释一下这个解决方案吗?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-18 07:35:37

0x01是最低有效位设置,因此十进制值为1。

0x80是8位字节集的最高有效位。如果它存储在有符号字符中(在使用2补码记法的机器上-正如您可能遇到的大多数机器都会遇到的那样),它是最负的值(十进制-128);在无符号字符中,它是十进制+128。

另一个成为第二特性的模式是设置了所有位的0xFF;对于有符号字符是decimal -1,对于无符号字符是255。当然,有0x00或0,没有设置任何位。

循环在第一个周期执行的操作是检查是否设置了LSB (最低有效位),如果设置了,则在结果中设置MSB (最高有效位)。在下一个周期中,它检查下一个到LSB,并将下一个设置为MSB,依此类推。

代码语言:javascript
复制
| MSB |     |     |     |     |     |     | LSB |
|  1  |  0  |  1  |  1  |  0  |  0  |  1  |  1  |   Input
|  1  |  1  |  0  |  0  |  1  |  1  |  0  |  1  |   Output
|  1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |   0x80
|  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |   0x01
|  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |   (0x80 >> 1)
|  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |   (0x01 << 1)
票数 8
EN

Stack Overflow用户

发布于 2010-04-18 07:39:20

每个十六进制数字代表4位,因此

  • 0x01只是一种很长的写法1.
  • 0x80是用二进制1000或128写的一种简写方式。

解决方案是使用按位运算符测试和设置值。

表达式:

代码语言:javascript
复制
if (a & b) { ... }

执行'...‘如果相同的位在'a‘和'b’中都是1。

表达式

代码语言:javascript
复制
c |= b

将'c‘中的位设置为1,如果它们在'b’中为1。

循环将test & set位沿线路向下移动。

祝好运!

票数 5
EN

Stack Overflow用户

发布于 2019-05-05 01:37:08

0x010x80被特意写成十六进制表示法,以强调它们作为unsigned char类型的最低有效位和最高有效位的重要性。

然而,作者犯了几个错误:

  • CHAR_BITS拼写错误:它应该是CHAR_BIT.
  • using CHAR_BIT,而不是硬编码几乎通用的值对于完全可移植性来说,这是一项有价值的工作,但是只有在CHAR_BIT == 8.
  • there是另一个微妙的可移植性问题时,使用8才会使这一努力化为乌有:0x01 << shift将在sizeof(unsigned char) == sizeof(int)的平台上具有未定义的shift = CHAR_BIT-1行为,因为<代码>D18具有类型<代码>D19(而不是D20,不是吗?)。<代码>H221<代码>F222

以下是适用于所有兼容平台的更正版本:

代码语言:javascript
复制
#include <limits.h>

unsigned char reverse(unsigned char c) {
    int shift;
    unsigned char result = 0;

    for (shift = 0; shift < CHAR_BIT; shift++) {
        result <<= 1;
        result |= c & 1;
        c >>= 1;
    }
    return result;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2660484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档