【问题标题】:C: Getting the most significant and least significant bitsC:获取最高有效位和最低有效位
【发布时间】:2020-09-07 11:13:41
【问题描述】:

我得到了一个 32 位无符号整数,我正在尝试将该无符号整数中的 8 个最高有效位保存到一个无符号字符中。然后我想将这些位清除为 0。最后一部分可以用掩码完成,但我不确定如何准确地找到 8 个最高有效位,然后让掩码确切知道要清除哪些位。

另一个相关的问题是我试图找到最低有效位并将其向左移动以使其成为最高有效位并返回该值。像上面一样,我不确定如何找到最低有效位,然后知道将其向左移动多远

【问题讨论】:

  • this question 有帮助吗?
  • num &= 0x00ffffff 将清除 8 个最高有效位。
  • 您确定要 8 个最高有效位还是 8 个最高有效非零位?
  • 关于 LSB 的同样问题
  • 我想要 8 个最重要的非零位。至少,它也是第一个零位。

标签: c bit-manipulation bitwise-operators bit-shift bitwise-and


【解决方案1】:

您可以编写两个通用函数,其中一个返回无符号字符类型对象的指定字节,另一个返回一个数字,该数字的位已清除,用作参数。

这是一个演示程序。

#include <stdio.h>
#include <limits.h>

unsigned char extract_byte( unsigned int x, size_t n )
{
    n %= sizeof( x );

    return  x >> CHAR_BIT * n & 0xFF;
}

unsigned int clear_byte( unsigned int x, size_t n )
{
    n %= sizeof( x );

    return x & ~( 0xFF << n * CHAR_BIT );
}

int main(void) 
{
    unsigned int x = 0x04030201;

    for ( size_t i = 0; i < sizeof( x ); i++ )
    {
        printf( "%hhu ", extract_byte( x, i ) );
    }
    putchar( '\n' );

    for ( size_t i = 0; i < sizeof( x ); i++ )
    {
        printf( "%#x ", x = clear_byte( x, i ) );
    }
    putchar( '\n' );

    return 0;
}

它的输出是

1 2 3 4 
0x4030200 0x4030000 0x4000000 0 

【讨论】:

  • 没有for循环有没有办法做到这一点?
  • @PhantomProgramer for 循环有什么用?!这是一个示范节目。它显示了如何从数字中提取任何字节。调查程序中使用的函数。
  • @PhantomProgramer 如果您想学习,您将需要在代码中尝试此操作并提出具体问题。
  • 为什么使用CHAR_BIT0xFF 而不是8 * n &amp; 0xFFCHAR_BIT * n &amp; UCHAR_MAX0xFF &lt;&lt; n 最好是 0xFFu &lt;&lt; n 以避免符号移位。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2014-05-20
  • 1970-01-01
  • 2015-03-25
  • 2013-11-13
  • 2019-08-14
相关资源
最近更新 更多