c/c++语言开发共享使用按位运算符从32位整数中检索字节

这是问题,我现在有什么,我只是不明白它是怎么回事……

getByte – 从字x中提取字节n从0(LSB)到3(MSB)编号的字节示例:getByte(0x12345678,1)= 0x56法律操作:! 〜&^ | + <> Max ops:6评级:2

int getByte(int x, int n) { return ((x <> (8 * n)); } 

    你的移位没有任何意义 – 首先,你向左移动(24 – 8n)位,然后向右移动8n位。 为什么? 而且,这是错的。 如果n为0,则将x向左移位24位并返回该值。 试试笔和纸,看看这是完全错误的。

    正确的方法是:

     int getByte(int x, int n) { return (x >> 8*n) & 0xFF; } 

    除非我完全弄错,否则您的代码在数学上是不正确的。

     getByte(0x000000ff, 0) { 24 - 8 * n = 24; 8 * n = 0; 0x000000ff << 24 = 0xff000000; 0xff000000 >> 0 = 0xff000000; return 0xff000000; // should return 0xff } 

    不允许使用运算符-特别是*是一个问题(不能做* 8 )。 我想出了这个:

     uint8_t getByte (uint32_t x, int n) { switch (n) { case 0: return x & 0xff; case 1: return (x >> 8) & 0xff; case 2: return (x >> 16) & 0xff; case 3: return x >> 24; } } 

    不完全漂亮,但它符合问题描述:6个运营商,所有这些都是合法的。

    编辑:对于如何避免* 8有一个(非常明显的)想法

     uint8_t getByte (uint32_t x, int n) { return (x >> (n << 3)) & 0xff; } 

    我不明白你的function如何运作。 试试这个:

     int getByte(int x, int n) { return (x >> (8 * n)) & 0xFF; } 

      以上就是c/c++开发分享使用按位运算符从32位整数中检索字节相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549662.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐