Training2:位操作训练

来源:互联网 发布:乐知英语 编辑:程序博客网 时间:2024/05/16 10:10


题目一:请编写一个c函数,该函数给出一个字节中被置为1的位的个数

#include <stdio.h>

 

int main()

{

int num, mask;

int count = 0;

int i;

char str[20];

 

printf("Please input a number:\n");

scanf("%d", &num);

 

    mask = 1 << 7;

 

for(i = 0; i < 8; i++)

{

if((num & mask ? '1' : '0') == '1')

{

count++;

str[i] = 1;

}

else

{

str[i] = 0;

}

num <<= 1;

}

    

printf("the number is:");

for(i = 0; i < 8; i++)

{

        printf("%d", str[i]);

}

printf("\n");

    printf("the number of one is %d.\n", count);

 

    return 0;

}

 

题目二:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1p2.

#include <stdio.h>

 

int main()

{

int num, mask;

    int p1, p2;

int i = 0;

int j;

char str[50];

 

printf("Please input a number:\n");

scanf("%d", &num);

    printf("Please input p1 p2(<32):\n");

scanf("%d %d", &p1, &p2);

    

mask = 1 << (p2 - 1);

 

    while(p2 >= p1)

{

if((num & mask ? '1' : '0') == '1')

{

str[i++] = '1';

            p2--;

num <<= 1;

}

else

{

    str[i++] = '0';

p2--;

    num <<= 1;

}

}

 

printf("the binary system is:");

for(j = i-1; j >= 0; j--)

{

printf("%c", str[j]);

}

printf("\n");

 

 

    return 0;

}

 

题目三:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1p2位取反后输出

#include <stdio.h>

 

int main()

{

int num, mask;

    int p1, p2;

int i = 0;

int j;

char str[50];

 

printf("Please input a number:\n");

scanf("%d", &num);

    printf("Please input p1 p2(<32):\n");

scanf("%d %d", &p1, &p2);

    

mask = 1 << (p2 - 1);

 

    while(p2 >= p1)

{

if((num & mask ? '1' : '0') == '1')

{

str[i++] = '0';

            p2--;

num <<= 1;

}

else

{

    str[i++] = '1';

p2--;

    num <<= 1;

}

}

 

printf("the binary system is:");

for(j = i-1; j >= 0; j--)

{

printf("%c", str[j]);

}

printf("\n");

}

 

题目四:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数ap位设置为v,输出修改后的该整数的二进制表示.

#include <stdio.h>

 

int main()

{

int a, p, v, mask;

int i = 0;

char str[50];

 

printf("Please input a = ");

scanf("%d", &a);

printf("\n");

printf("Please input p(<32) = ");

scanf("%d", &p);

printf("\n");

printf("PLease input v(0/1) = ");

scanf("%d", &v);

printf("\n");

 

    mask = 1 << 31;

    

for(i = 0; i < 32; i++)

{

if((a & mask ? '1' : '0') == '1')

{

           str[i] = '1';

   a <<= 1;

}

else

{

str[i] = '0';

a <<= 1;

}

}

 

if(v == 0)

{

str[31-p] = '0';

}

else

{

str[31-p] = '1';

}

 

for(i = 0; i < 32; i++)

{

printf("%c", str[i]);

}

    printf("\n");

 

 

    return 0;

}

 

题目五:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果

提示:0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1;

 

#include <stdio.h>

 

int main()

{

int a, mask;

int i;

int str[50], n_str[50];

    

printf("Please input a number:");

scanf("%d", &a);

    

mask = 1 << 31;

 

for(i = 0; i < 32; i++)

{

if((a & mask ? '1' : '0') == '1')

{

str[i] = 1;

a <<= 1;

}

else

{

str[i] = 0;

a <<= 1;

}

}

 

for(i = 0; i < 32; i++)

{

if(i == 0)

{

            n_str[i] = str[31] ^ str[i+1];

}

else if(i == 31)

{

n_str[i] = str[1] ^ str[i-1];

}

else

{

    n_str[i] = str[i-1] ^ str[i+1];

}

}

 

for(i = 0; i < 32; i++)

{

printf("%d", n_str[i]);

}

printf("\n");

 

    return 0;

}

 

0 0
原创粉丝点击