【问题标题】:get n leftBits of binary in C在C中获得n个二进制的leftBits
【发布时间】:2020-09-17 13:13:33
【问题描述】:

得到函数 getLeftBits(int n,int num) 我需要从左边返回 num 位例如:

getLeftBits(7,31) --> 3  
getLeftBits(-1,2) --> 3

我为每个 n>0 轻松处理:n >> (32 - num)
但是当 n

有什么建议吗?

【问题讨论】:

  • 想要发生什么? nint 还是 unsigned int?使用int,您将在左侧获得符号扩展填充,但使用unsigned int,您将获得零填充。根据您的第二个示例,您可能希望第一个参数是无符号的,因此:unsigned int getLeftBits(unsigned int n,int num) { return n >> (32 - num); }。另外,如果num 为零(无论n 的值如何,您总是会得到相同的结果)怎么办?或者,如果num 是否定的,您想要发生什么?
  • @CraigEstey:它是由实现定义的你是否会在左边得到一个符号扩展填充或其他东西。 C17 6.5.7 位移位运算符 E1 >> E2 的结果是E1 右移E2 位位置。如果E1 具有无符号类型或E1 具有带符号类型和非负值,则结果的值是E1/2^E2 商的整数部分。如果E1 具有带符号类型和负值,则结果值是实现定义的。

标签: c binary bit-manipulation


【解决方案1】:

如果我理解得很好,您想查看数字的二进制表示的最左边的 n 位。

大多数实现将使用算术右移而不是逻辑右移。您需要将数字转换为无符号整数以防止这种行为。移动无符号数时无关紧要,但移动有符号数时很重要。

unsigned getLeftBits(int n, int num)
{
    return n >> (32 - num);
}

unsigned getLeftBits1(int n, int num)
{
    return (unsigned)n >> (32 - num);
}

getLeftBits:
        mov     ecx, 32
        mov     eax, edi
        sub     ecx, esi
        sar     eax, cl              <-------here
        ret
getLeftBits1:
        mov     ecx, 32
        mov     eax, edi
        sub     ecx, esi
        shr     eax, cl              <-------here            
        ret

https://godbolt.org/z/JuY_z4

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多