【问题标题】:How can I store 4 char into an unsigned int using bitwise operation?如何使用按位运算将 4 个字符存储到 unsigned int 中?
【发布时间】:2011-04-24 17:51:04
【问题描述】:

我想将 4 个字符(4 个字节)存储到一个无符号整数中。

【问题讨论】:

    标签: c bit-manipulation


    【解决方案1】:

    您需要将每个 char 的位移过来,然后将它们组合到 int 中:

    unsigned int final = 0;
    final |= ( data[0] << 24 );
    final |= ( data[1] << 16 );
    final |= ( data[2] <<  8 );
    final |= ( data[3]       );
    

    这使用了一个字符数组,但无论数据如何输入,原理都是一样的。(我认为我的转变是正确的)

    【讨论】:

    • 我不建议在 C 的示例代码中使用 char 关键字。
    • 哦,是的,这很糟糕。固定的。 :)
    • 如果 data 是一个 signed char 数组,|=&lt;&lt; 将无法正常工作。
    • @Pascal:是的,它会的;有符号类型的左移是明确定义的。
    • @Clifford 我并不是说它的定义不明确。我是说它不能满足程序的需要。在已签名字符的编译器上尝试 char data[4] = {-12,57,33,-120}; main() { unsigned int final = 0; final |= ( data[0] &lt;&lt; 24 ); final |= ( data[1] &lt;&lt; 16 ); final |= ( data[2] &lt;&lt; 8 ); final |= ( data[3] ); printf("%x\n", final); }
    【解决方案2】:

    另一种方法:

    #include <stdio.h>
    union int_chars {
        int a;
        char b[4];
    };
    int main (int argc, char const* argv[])
    {
        union int_chars c;
        c.a = 10;
        c.b[0] = 1;
        c.b[1] = 2;
        c.b[2] = 3;
        c.b[3] = 4;
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      越简单越好:

      /*
      ** Made by CHEVALLIER Bastien
      ** Prep'ETNA Promo 2019
      */
      
      #include <stdio.h>
      
      int main()
      {
        int i;
        int x;
        char e = 'E';
        char t = 'T';
        char n = 'N';
        char a = 'A';
      
        ((char *)&x)[0] = e;
        ((char *)&x)[1] = t;
        ((char *)&x)[2] = n;
        ((char *)&x)[3] = a;
      
        for (i = 0; i < 4; i++)
          printf("%c\n", ((char *)&x)[i]);
        return 0;
      }
      

      【讨论】:

        【解决方案4】:

        你可以这样做(不是按位,但可能更容易):

        unsigned int a;
        char *c;
        
        c = (char *)&a;
        c[0] = 'w';
        c[1] = 'o';
        c[2] = 'r';
        c[3] = 'd';
        

        或者如果你想按位使用,你可以使用:

        unsigned int a;
        a &= ~(0xff << 24); // blank it
        a |= ('w' << 24); // set it
        // repeat with 16, 8, 0
        

        如果你不先把它清空,你可能会得到另一个结果。

        【讨论】:

        • 你不需要演员表吗,应该是 c = (char *)&a?
        • 那是可选的。我会添加它。谢谢
        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多