C语言两个小问题

来源:百度知道 编辑:UC知道 时间:2024/06/14 08:33:23
1、假设某C语言编译系统为算术右移,现有一实现逻辑右移的函数:
short getbits(unsigned short value,int n)
{unsigned short z;
z=(~(1>>n))&(value>>n);
return(z);}
value为主函数传来的要右移的数,n为欲右移的位数。
问:z=(~(1>>n))&(value>>n)的原理何在?

2、问:a=a>15,假设在此之前,a的值是16,那么,经过此句之后,a的值是多少?假设在些之前,a的值为14,那么,经过此句之后,a的值是多少?

希望高手不吝赐教,小生感激不尽!

①z=(~(1>>n))&(value>>n)中左边的1右移n位后取反将为全1再和右边的value右移n位后的结果做位与,这就实现了value逻辑右移功能,例如value=109右移3即01101101右移3,执行后得z=13即00001101。
②a=a>15按算符优先级即a=(a>15),而a>15先处理,结果为真则为1,否则为0,再把此结果赋值给a,故a将为1或0。

z=(~(1>>n))&(value>>n)中“与”前将n个位数清零,“与”后是将被处理的数右移n位。其实就是右移并在后面补零。
a=16时,运算后 a=1
a=14时,运算后 a=0 运算后都是逻辑值,调试验证过的。

z=(~(1>>n))&(value>>n)中“与”前将n个位数清零,“与”后是将被处理的数右移n位。其实就是右移并在后面补零。