位操作训练
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;
}