您的位置:首页 > 大数据 > 人工智能

Training2:位操作训练

2016-07-16 19:58 483 查看
Training2:位操作训练

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

#include <stdio.h>

typedef unsigned int uint;

uint count1(uint num)
{
int i;

uint count = 0;
uint mask = 0x00000001;

for(i = 0; i < 31; i++)
{
if((num >> i) & mask == 1)
{
count++;
}
}

return count;
}

int main()
{
uint num;
uint res;

printf("input a num\n");
scanf(" %u", &num);

res = count1(num);

printf("the num of 1 is %d\n", res);

return 0;
}


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

#include <stdio.h>

typedef unsigned int uint;

void output(uint num, uint p1, uint p2)
{
int i;
int tmp;
int j = 0;

static int arr[32];

uint mask = 0x00000001;

for(i = p1 - 1; i < p2; i++)
{
tmp = (num >> i) & mask;
arr[j] = tmp;
j++;
}

for(i = 0; i < j; i++)
{
printf("%d", arr[i]);
}

printf("\n");
}

int main()
{
uint num;
uint p1;
uint p2;

char *tab = NULL;

printf("input a num\n");
scanf(" %u", &num);

printf("input p1 and p2(p1<p2)\n");
scanf(" %u", &p1);
scanf(" %u", &p2);

output(num,p1,p2);

return 0;
}


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

#include <stdio.h>

typedef unsigned int uint;

void output(uint num, uint p1, uint p2)
{
int i;
int tmp;
int j = 0;

static int arr[32];

uint mask = 0x00000001;

for(i = p1 - 1; i < p2; i++)
{
tmp = (num >> i) & mask;
arr[j] = tmp;
j++;
}

for(i = j - 1; i >= 0; i--)
{
printf("%d", arr[i]);
}

printf("\n");
}

int main()
{
uint num;
uint p1;
uint p2;

char *tab = NULL;

printf("input a num\n");
scanf(" %u", &num);

printf("input p1 and p2(p1<p2)\n");
scanf(" %u", &p1);
scanf(" %u", &p2);

output(num,p1,p2);

return 0;
}


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

#include <stdio.h>

typedef unsigned int uint;

void ten2two(uint num)
{
int i;
int j = 0;

uint arr[32];
uint tmp;
uint mask = 0x00000001;

for(i = 31; i >= 0; i--)
{
tmp = (num >> i) & mask;
arr[j] = tmp;
j++;
}

for(i = 0; i < j; i++)
{
printf("%d", arr[i]);
}

printf("\n");
}

uint set_num(uint num, uint p, uint v)
{
uint mask = 0x00000001;

if(v == 1)
{
mask = mask << (p - 1);
num = num | mask;
}
else
{
mask = ~(mask << (p - 1));
num = num & mask;
}

return num;
}

int main()
{
uint res;
uint num;
uint p;
uint v;

printf("input a num\n");
scanf(" %u", &num);

printf("input set location(1~32)\n");
scanf(" %u", &p);

printf("input set num(0|1)\n");
scanf(" %u", &v);

ten2two(num);

res = set_num(num,p,v);

ten2two(res);

return 0;
}


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

#include <stdio.h>

void func(int num)
{
int i = 0;
int sum = 0;
int bit = 0;
int temp = 0;

for(i = 0; i < 32; i++)
{
if(i > 0 && i < 31)
{
if((num >> (i - 1) & 1) == (num >> (i + 1) & 1))
{
bit = 0;
}
else
{
bit = 1;
}
}

temp = i;
while(temp)
{
bit = bit * 2;
temp--;
}

sum = bit + sum;
}

printf("change:%d\n", sum);
}

int main()
{
int num;

printf("input a number\n");
scanf(" %d",&num);

func(num);

return 0;
}


6.题目:将任意十进制转化为十六进制进行输出。

#include <stdio.h>

char * to16(unsigned int num)
{
int i;
unsigned int tmp;

static char str[11];

unsigned int mask = 0x0000000f;

str[0] = '0';
str[1] = 'x';
str[10] = '\0';

for(i = 0; i < 8; i++)
{
tmp = num & mask;

if(tmp >= 0 && tmp <= 9)
{
str[9 - i] = tmp + '0';
}
else
{
str[9 - i] = tmp - 10 + 'a';
}
num = num >> 4;
}

return str;
}

int main()
{
unsigned int num;
char *str = NULL;

printf("input a num\n");
scanf(" %u", &num);

str = to16(num);
printf("%s\n", str);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息