15.1
//使用位运算显示二进制数
#include <stdio.h>
char * itobs(int,char *);
void show_bstr(const char*);
int main(void)
{
//用8位表示一个字节,最后加1为考虑到是数组为\0预留
char bin_str[8 * sizeof(int) + 1];
int number;
puts("Enter integers and see them in binary.");
puts("Non-numeric input terminates program.");
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)
{
//01是一个掩码的8进制表示形式也可以写为 1&n
ps[i] =(01 & n) + '0';
}
ps[size] = '\0';
return ps;
}
/* 4位一组显示二进制字符串*/
void show_bstr(const char * str)
{
int i = 0;
while(str[i])
{
putchar(str[i]);
if(++i % 4 == 0 && str[i])
{
putchar(' ');
}
}
}
15.2
//将一个数的最后n位进行转置,然后使用位运算显示二进制数
#include <stdio.h>
char * itobs(int,char *);
void show_bstr(const char*);
int invert_end(int num, int bits);
int main(void)
{
//用8位表示一个字节,最后加1为考虑到是数组为\0预留
char bin_str[8 * sizeof(int) + 1];
int number;
puts("Enter integers and see them in binary.");
puts("Non-numeric input terminates program.");
while(scanf("%d",&number) == 1)
{
itobs(number,bin_str);
printf("%d is ",number);
show_bstr(bin_str);
putchar('\n');
number = invert_end(number,4);
printf("Inverting the last 4 bits gives\n");
show_bstr(itobs(number,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)
{
//01是一个掩码的8进制表示形式也可以写为 1&n
ps[i] =(01 & n) + '0';
}
ps[size] = '\0';
return ps;
}
/* 4位一组显示二进制字符串*/
void show_bstr(const char * str)
{
int i = 0;
while(str[i])
{
.
putchar(str[i]);
if(++i % 4 == 0 && str[i])
{
putchar(' ');
}
}
}
// 首先根据要转制的位数(参数bits)获得掩码(mask),然后对(参数num)与掩码进行位或运算(^)得出最后的值
int invert_end(int num,int bits)
{
int mask = 0;
int bitval = 1;
while(bits-- > 0)
{
mask |= bitval;
bitval <<= 1;
}
return num ^ mask;
}