扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
unsigned int 左移32位相当于不移动。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、网络空间、营销软件、网站建设、富宁网站维护、网站推广。
移位运算,要求移位结果至少保留一位原来的数字,也就是说 32 位,最多左移或右移31位,超出31位 得到的数据 是无意义的。
0xffffffff 左移31位是 0x80000000.
没有办法移动成 32位 全0。(除非使用的编译器另有规定)。
-----------------------------
unsigned int a=0xffffffff;
printf("%#x %#x %#x %#x\n",a,a31,a32, a32 );
MS VC++ 6.0 输出 是:
0xffffffff 0x80000000 0xffffffff 0xffffffff
05左移5位,即000000
06左移6位,即0000000
左移后是用二进制表示的,
具体的这个程序中有什么用,应该看程序本身,
就像#define PI_FRMERR (0 5)
用000000代替PI_FRMERR可能与某个数进行与操作或其他的。
C语言中按位左移的运算符为,其规则如下:
对于操作an,
1 按照二进制值每位向高位(书写上是向左)移动n位;
2 最高位(最左边的)n位舍去;
3 最低位(最右边)填加n个0.
简单起见,用char型举例如下:
例一
0x12 3 =
B00010010 3 =
B10010 000(这里最高位的三个0被舍去,其它依次左移,最低位补三个0) =
0x90
即0x12 3 = 0x90
例二
0x9E 2 =
B10011110 2 =
B01111000 (最高位10舍去,最低位补两个0)=
0x78
可以编写如下程序验证:
#include stdio.h
void check(char a, int n)
{
printf("0x%hhx %d = 0x%hhx\n", a, n, an);
}
int main()
{
check(0x12, 3);
check(0x9e, 2);
return 0;
}
其运行结果为
0x12 3 = 0x90
0x9e 2 = 0x78
可以看到与我们计算结果是相符的。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流