获取C中二进制文件的n个左位
获取函数getLeftBits(int n,int num),我需要从左侧返回num位,例如:获取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(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