Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取C中二进制文件的n个左位_C_Binary_Bit Manipulation - Fatal编程技术网

获取C中二进制文件的n个左位

获取C中二进制文件的n个左位,c,binary,bit-manipulation,C,Binary,Bit Manipulation,获取函数getLeftBits(int n,int num),我需要从左侧返回num位,例如: getLeftBits(7,31) --> 3 getLeftBits(-1,2) --> 3 对于每个n>0,我都能轻松处理它:n>>(32-num) 但是当n如果我理解的很好,你想看到这个数的二进制表示的n个最左边的位 大多数实现将使用算术右移,而不是逻辑右移。您需要将数字强制转换为无符号整数以防止这种行为。移位无符号数字的时间并不重要,但移位有符号数字的时间很重要 无符号ge

获取函数getLeftBits(int n,int num),我需要从左侧返回num位,例如:

getLeftBits(7,31) --> 3  
getLeftBits(-1,2) --> 3
对于每个n>0,我都能轻松处理它:
n>>(32-num)


但是当n如果我理解的很好,你想看到这个数的二进制表示的n个最左边的位

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

无符号getLeftBits(int n,int num)
{
返回n>>(32-num);
}
无符号getLeftBits1(int n,int num)
{
返回(未签名)n>>(32-num);
}
getLeftBits:
mov ecx,32
电子数据交换
子ecx,esi

你想发生什么?
n
int
还是
无符号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
具有有符号类型和负值,则结果值由实现定义。
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