程序(位操作)

 

位操作训练

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

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd.
File name

Author
Jerey_Jobs   Version:0.1    Date:
Description

Funcion List:
*****************************************************/

#include <stdio.h>

int main()
{
    int a,i,MASK;
    int sum = 0;

    MASK = 1 << 31;      //
最高位为1,其余31位为0

    printf("Please input anumber:\n");
    scanf("%d",&a);
    printf("The number %d has",a);
    for(i=1;i<=32;i++)
    {
        if((a & MASK) == MASK)
            sum++;
        a <<= 1;
    }
    printf("%d 1.\n",sum);


    return 0;
}
 


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

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
char * itobs( int,char * );
void show_bstr( const char * );


int main()
{
char bin_str[8 * sizeof(int) + 1];
int number;


puts("Enter integers and see them in binary.");
while(scanf("%d",&number) == 1)
{
itobs(number,bin_str);
printf("%d is ",number);
show_bstr(bin_str);
putchar('\n');
}
puts("Bye!");


    return 0;
}


char * itobs(int n,char * ps)
{
int i;
static int size = 8 * sizeof(int);


for(i = size - 1;i >= 0;i--,n>>=1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';


return ps;
}


void show_bstr(const char * str)
{
int p1,p2;  //p1<p2<32


int i = 0;
static int size = 8 * sizeof(int);


while(str[i])
{
putchar(str[i]);
if(++i % 4 == 0 && str[i])
   putchar(' ');
}
putchar('\n');
printf("please input two numbers p1.p2 and p1<p2<32\n");
scanf("%d,%d",&p1,&p2);


for(i = size - p1;i >= size - p2;i--)
putchar(str[i]);
}
 


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

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
char * itobs( int,char * );
void show_bstr( const char * );


int main()
{
char bin_str[8 * sizeof(int) + 1];
int number;


puts("Enter integers and see them in binary.");
while(scanf("%d",&number) == 1)
{
itobs(number,bin_str);
printf("%d is ",number);
show_bstr(bin_str);
putchar('\n');
}
puts("Bye!");


    return 0;
}


char * itobs(int n,char * ps)
{
int i;
static int size = 8 * sizeof(int);


for(i = size - 1;i >= 0;i--,n>>=1)
ps[i] = (01 & n) + '0';
ps[size] = '\0';


return ps;
}


void show_bstr(const char * str)
{
int p1,p2;  //p1<p2<32


int i = 0;
static int size = 8 * sizeof(int);


while(str[i])
{
putchar(str[i]);
if(++i % 4 == 0 && str[i])
   putchar(' ');
}
putchar('\n');
printf("please input two numbers p1.p2 and p1<p2<32\n");
scanf("%d,%d",&p1,&p2);


for(i = size - p1;i >= size - p2;i--)
{
// str[i] = ~str[i];数组内存的是字符,不能取反
putchar(str[i] == '0'?'1':'0');
}
}

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

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>


int main()
{
int MASK=1;


int num,p,v,i;


printf("Please input a integer number:\n ");
scanf("%d",&num);
printf("input a integer number(<=32) and anumber(0 | 1):");
scanf("%d %d",&p,&v);


if(v == 1)
{
MASK <<= (p-1);
num = num | MASK;
// printf("%d\n",num);
   
}


if(v == 0)
{
MASK <<= (p - 1);
MASK = ~MASK;
num = num & MASK;
    //  printf("%d\n",num);
}
for(i=1;i<=32;i++)
{
MASK = 1 << 31;
putchar(num & MASK?'1':'0');
num <<= 1;
if(i % 4 == 0)
putchar(' ');
}
    printf("\n");
    return 0;
}

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

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

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>


int main()
{
int a,b,i,mask;
    int size = 32;
int str1[size],str2[size];
mask = 1 << 31;


printf("Please input a integer number:\n");
scanf("%d",&a);


for(i = 32;i >=1;i--)
{
str1[i] = (a & mask ? 1:0);   //最高位放在str[32]中
a <<= 1;
printf("%d",str1[i]);
}
printf("\n");
str2[32] = str1[31] + str1[1];
printf("%d",str2[32]);
for(i = 31;i >= 2;i--)
{
str2[i] = str1[i - 1] ^ str1[i + 1];
        printf("%d",str2[i]);
}
str2[1] = str1[2] + str1[32];
printf("%d",str2[1]);
printf("\n");


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值