1.定义ilog2函数 - 返回 floor(log base 2 of x), x > 0 (即求以2为底x的对数,且向下取整)函数原型为:int ilog2(int x);
例如:ilog2(17) = 4
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",ilog2(x));
return 0;
}
答案(标准答案):
#include<stdio.h>
int ilog2(int x){
int i,y=2;
for(i=0;y<=x;){
y=y*2;
i++;
}
return i;
}
2.
设计一个isLessOrEqual函数,在不使用任何关系运算符的情况下,判断x <= y是否成立,成立则返回1,否则返回0
函数原为:int isLessOrEqual(int x, int y);
例如:isLessOrEqual(4, 5) = 1
int main(){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",isLessOrEqual(x,y));
return 0;
}
答案:
int isLessOrEqual(int x, int y){
int a=((y-x)>>31)+1;
return a;
}
标准答案:
int isLessOrEqual(int x, int y){
int a=((y-x)>>7)+1;
return a;
}
3.
定义一个函数,在不使用任何关系运算符的情况下,对参数x的符号进行判断,如果大于0则返回1,否则返回1
函数原型为:int isPositive(int x);
例如:isPositive(-1) = 0
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",isPositive(x));
return 0;
}
答案:
int isPositive(int x){
int a=(x-1)>>31;
return a+1;
}
4.设计一个bitAnd函数,在不使用按位与运算符&的情况下,实现按位与运算,可以使用按位取反~和按位或|
函数原型为:int bitAnd(int x, int y);
例如:bitAnd(6, 5) = 4
int main(){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",bitAnd(x,y));
return 0;
}
答案(标准答案):
int bitAnd(int x, int y)
{
int a=~(~x|~y);
return a;
}
5.设计一个函数,在不使用负号的情况下,返回-x
函数原型为:int negate(int x);
例如:negate(1) = -1
main函数已经写好了,请根据main函数的内容完成该类的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",negate(x));
return 0;
}
答案(标准答案):
int negate(int x){
int a;
a=~x+1;
return a;
}
#include<stdio.h>
int main(){
int x;
scanf("%d",&x);
printf("%d\n",negate(x));
return 0;}
6.定义一个函数,在不使用逻辑非运算符!的情况下,用于求!x
函数原型为:int bang(int x);
例如:bang(5) = 0, bang(0) = 1
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",bang(x));
return 0;
}
答案(标准答案):
int bang(int x)
{
int y = x | ( (~x)+1);
y = y >> 31;
y = y +1;
return y;
}
7.定义divpwr2函数,在不使用除法运算符的情况下,计算 x/(2^n),0 <= n <= 30,要求向 0 舍入
例如:divpwr2(15, 1) = 7, divpwr2(-33, 4) = -2
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x,n;
scanf("%d%d",&x,&n);
printf("%d\n",divpwr2(x,n));
return 0;
}
答案:
int divpwr2(int x,int n){
int a;
if(x>=0){
a=x>>n ;
}
else{
int q= ~((~0)<<n);
a = (x + q ) >> n;
}
return a;
}
标准答案:
int divpwr2(int x, int n)
{
int tmp = (~( (x >> 31) & 0x1) )+1 ;
int q= ~((~0)<<n);
int ans = (x + (tmp & q) ) >> n ;
return ans;
}
8.
设计一个函数,该函数将给定的任意整型数据视为一个IPv4地址,并以点分十进制形式显示该IP地址。例如:整数为-1455049865(十六进制表示为0xA945B377),对应的IP地址为:169.69.179.119。函数原型为:void showIP(int x);
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
showIP(x);
return 0;
}
答案:
#include<stdio.h>
#include<math.h>
void showIP(int x)
{
printf("%d",((unsigned int)x&0xff000000)>>24);
printf(".");
printf("%d",((unsigned int)x&0x00ff0000)>>16);
printf(".");
printf("%d",((unsigned int)x&0x0000ff00)>>8);
printf(".");
printf("%d",((unsigned int)x&0x000000ff));
}
标准答案:
void showIP(int x){
int b,i,c=0,d,a=1,e;
for(i=31;i>=0;i--){
b=(x>>i)&1;
if(b==1){
d=(a<<(i%8));
e=(d^e);}
if(i%8==0){
printf("%d",e);
e=0;
if(i!=0)
printf("."); }
}
}
9.
设计一个函数,用于测试参数x是否能被n位补码整数表示(1 <= n <= 32)。如果能返回1,否则返回0
函数原型为:int fitsBits(int x, int n);
例如: fitsBits(5, 3) = 0, fitsBits(-4, 3) = 1
main函数已经写好了,请根据main函数内容完成该函数的设计:
int main(){
int x,n;
scanf("%d%d",&x,&n);
printf("%d\n",fitsBits(x,n));
return 0;
}
答案:
#include<math.h>
int fitsBits(int x, int n){
int a=0,b,c;
b=pow(2,n-1)-1;
c=pow(2,n-1);
c=-c;
if(c<=x&&x<=b){
a=1;
}
return a;
}
标准答案
int fitsBits(int x, int n)
{
int tmp = ~((~n)+1);
int tmpx = x >> tmp;
int ans = ( !tmpx | !(tmpx+1) );
return ans;
}
10.
设计一个函数,返回长度为n位(1<=n<=32)的无符号整数能表示的最大值。
函数原型为:unsigned umax(int n);
例如: umax(3)=7,umax(6)=63;
main函数已经写好了,请根据main函数内容完成该函数的设计:
int main(){
int n;
scanf("%d",&n);
printf("%u\n",umax(n));
return 0;
}
答案(标准答案):
unsigned umax(int n){
int i,a=1;
for(i=0;i<n;i++){
a=a*2;
}
return a-1;
}
11.
设计一个函数,返回长度为n位(2<=n<=32)的有符号整数能表示的最大正数。
函数原型为:int tmax(int n);
例如: tmax(3)=3,tmax(6)=31;
main函数已经写好了,请根据main函数内容完成该函数的设计:
int main(){
int n;
scanf("%d",&n);
printf("%d\n",tmax(n));
return 0;
}
答案(标准答案):
int tmax(int n){
int i,a=1;
for(i=0;i<n-1;i++){
a=a*2;
}
return a-1;
}
12.
设计一个函数,返回长度为n位(1<=n<=32)的有符号整数能表示的最小负数。
函数原型为:int tmin(int n);
例如: tmin(3)=-4,tmin(6)=-32;
main函数已经写好了,请根据main函数内容完成该函数的设计:
int main(){
int n;
scanf("%d",&n);
printf("%d\n",tmin(n));
return 0;
}
答案(标准答案):
int tmin(int n){
int i,a=1;
for(i=0;i<n-1;i++){
a=a*2;
}
a=-a;
return a;
}
13.
设计一个函数,用于输出一个整型数据的32位二进制补码编码。
函数原型为:void twosComplement(int x);
例如:twosComplement(-1)的输出为:11111111111111111111111111111111
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
twosComplement(x);
return 0;
}
答案(标准答案):
#include<stdio.h>
void twosComplement(int x){
int b,i;
for(i=31;i>=0;i--){
b=(x>>i)&1;
printf("%d",b);
}
}
int main(){
int x;
scanf("%d",&x);
twosComplement(x);
return 0;
}
14.
设计一个函数,该函数返回一个整数数据的二进制镜像数。所谓二进制镜像数,是指二进制表示和该数的二进制表示正好逆序的数。
例如:二进制序列1010的逆序列是0101
函数原型为:int binMirror(int x);
例如:binMirror(1)=-2147483648
main函数已经写好了,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",binMirror(x));
return 0;
}
答案(标准答案):
int binMirror(int x){
int b,i,d=0,e=0;
for(i=31;i>=0;i--){
b=(x>>i)&1;
if(b==1){
d=(1<<(31-i));
e=(d^e);
}
}
return e;
}
15.
设计一个函数,用于返回一个整型数据中1的个数。
函数原型为:int bitCount(int x);
例如:bitCount(5) = 2, bitCount(7) = 3
main函数已经写好,请根据main函数的内容完成该函数的设计:
int main(){
int x;
scanf("%d",&x);
printf("%d\n",bitCount(x));
return 0;
}
答案
int bitCount(int x){
int a,b=0,i;
for(i=31;i>=0;i--){
a=(x>>(31-i))&1;
if(a==1){
b++;
}
}
return b;
}
标准答案:
int bitCount(int x){
int b,i,c=0;
for(i=0;i<32;i++){
b=(x>>i)&1;
if(b==1)
c++;
}
return c;
}
16.
对有符号整型数据使用>>右移运算符进行操作进行的是算术右移。现在请设计一个函数,要求对有符号整型数据进行逻辑右移。
该函数的原型是:int logicalShift(int x, int n);(0<=n<=31)
例如:logicalShift(0x87654321,4) 的结果应该为 0x08765432
main函数已经写好了,请根据main函数的情况完成该函数的设计:
int main(){
int x,n;
scanf("%x%d",&x,&n);
printf("%x\n",logicalShift(x,n));
return 0;
}
答案:
int logicalShift(int x, int n){
int y = 31-n;
int a,b=1,c=1,i;
for(i=0;i<y;i++){
c=c*2;
b=b+c;
}
a=(x>>n)&b;
return a;
}
标准答案:
int logicalShift(int x, int n){
int y = 32+(~n);
return (x>>n)&((1<<y)+(~0)+(1<<y));
}
17.
设计一个函数:int getByte(int x, int n);
该函数将参数x的值的第n个字节取出(0 <= n <= 3)并返回
例如:getByte(0x12345678,1) = 0x56
main函数已经写好,请根据main函数的内容,完成该函数的设计:
int main(){
int x,n;
scanf("%x%d",&x,&n); //注意,x以16进制格式输入
printf("%x\n",getByte(x,n)); //结果以16机制格式输出
return 0;
}
标准答案:
int getByte(int x, int n){
int b,i,a=0,c=0,d=0,e=0;
for(i=n*8;i<(n+1)*8;i++){
b=(x>>i)&1;
d=(b<<a++);
e=(d^e);
}
return e;
}
18.
设计一个函数:int clearMask(int x, int n);
该函数将参数x的值的第n位设置为0(0 <= n <= 31)并返回新的值
例如:clearMask(7, 5) = 7
main函数已经写好,请根据main函数的内容,完成该函数的设计:
int main(){
int x,n;
scanf("%d%d",&x,&n);
printf("%d\n",clearMask(x,n));
return 0;
}
标准答案:
int clearMask(int x, int n){
int a=~(1<<n);
return x&a;
}
19.
设计一个函数:int setMask(int x, int n);
该函数将参数x的值的第n位设置为1(0 <= n <= 31)并返回新的值
例如:setMask(7, 5) = 39
main函数已经写好,请根据main函数的内容,完成该函数的设计:
int main(){
int x,n;
scanf("%d%d",&x,&n);
printf("%d\n",setMask(x,n));
return 0;
}
标准答案:
int setMask(int x, int n){
int a=(1<<n);
return x|a;
}