急!一道位运算难题(C语言)在线等

来源:百度知道 编辑:UC知道 时间:2024/09/23 12:53:04
输入是int n (0 <= n <= 32)
输出是一个32-bit的数字,前n个bits都是1,其余bit都是0
如:
输入:n=0
输出:0x00000000

输入:n=4
输出:0xF0000000

输入:n=32
输出:0xFFFFFFFF
不好意思,忘了说限制了
只可以用这些符号:!,~,&,^,|,+,<<,>>
不能用-,||,&&,if,for
>> 是带符号右移

还有,不用scanf了,就写一个function就行了,最后一个return 就行了,不用printf了
谢谢!

大家都没看到要求吗?不能用“-”,“if“,”for“!!!如果让用我也就不用问了

所有人的答案都用了"-'或者"if"或者"for",都不符合要求。行了,我自己做出来了,这是答案,供大家参考:
int upperBits(int n) {

int Tmin = 1<<31; /* 0x80000000 */
int x = (Tmin>>n)<<1;
/* if n = 32, mask is all ones otherwise all zeros */
int mask = (n<<26)>>31;
return ((~mask)&x) | ((~0)&mask);
}

(-1)<<(32-n)

#include <stdio.h>

void main()
{
int n = 0;
int iNum = (int)-1;

// 得到n
scanf( "%d", &n );

if( n>0 )
{
iNum <<= (32-n);
}
else
{
iNum = 0;
}

printf( "0x%x", iNum );
}

long mask=0xFFFFFFFF;for(int i=0;i<32-n;i++)mask=mask<<1;/*左移32-n位,用0填充*//*最后以十六进制形式输出*/

1楼正解

没有使用那些元素的版本:

//---------------------------------------------------------------------------

#include <stdio.h>
#include <stddef.h>

void rel(int n)/*这是你要的函数*/
{
long int em;
int i=0;
em=n?4294967295:0;
while (n)
{
while (i+++n<32)
em<<=1;
break;
}
printf("0x%08X\n",em);
}

int main(void)
{
rel(32);/*这是显示调用效果*/
rel(4);
rel(0);
return 0;