1
#include<stdio.h>
int main(){
char ch;
while(ch=getchar()){
if(ch>=65&&ch<=90){
putchar(ch+32);
}
else
printf("%c",ch);
}
}
2.
#include<stdio.h>
int main(){
char ch;
while(ch=getchar()){
if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)){
putchar(ch-13);
}
else
putchar(ch);
}
}
3.
//如何确保程序不依赖于机器上的整型值长度;直接计算出长度
//数在进行位操作(& | << >> ~ ^)时是用二进制进行的
//unsigne int 格式为%u
#include <stdio.h>
#include <math.h>
unsigned int reverse_bits(unsigned int val);
int main()
{
unsigned int val;
scanf("%u", &val);
int sum = reverse_bits(val);
printf("\n%u", sum);
return 0;
}
unsigned int reverse_bits(unsigned int val)
{
unsigned int arr[64] = {0};
unsigned int i = 1, sum = 0;
int con = 0;
//这个循环计算出本计算机unsigned int占多少位
while (i)
{
i <<= 1;
con++;
}
printf(" con==%dbits\n", con);
for (int j = 0; j < con; j++)
{
arr[j] = (val & (1 << j)) >> j; //>>j保证每次计入一个数(除1/0后面的0)
// 0 31 - 1 30 - 2 29
sum += arr[j] << (con - j - 1);
}
for (int j = 0; j < con; j++)
{
printf("%u", arr[j]);
}
return sum;
}
4.
#include<stdio.h>
void set_bit(char bit_arr[],unsigned bit_number);
void clear_bit(char bit_arr[],unsigned bit_number);
void assign_bit(char bit_arr[],unsigned bit_number,int val);
int test_bit(char bit_arr[],unsigned bit_number);
int main(){
char arr[2]={0xff,0xff};
int a=test_bit(arr,1);
clear_bit(arr+1,1);
int b=test_bit(arr+1,1);
set_bit(arr+1,1);
int c=test_bit(arr+1,1);
printf("6");
}
int test_bit(char bitarr[],unsigned num){
if((*bitarr>>num-1)&1){
return 1;
}
else
return 0;
}
void clear_bit(char bitarr[],unsigned num){
*bitarr&=~(1<<num-1);
return ;
}
void set_bit(char bit_arr[],unsigned bit_number){
*bit_arr|=(1<<bit_number-1);
return ;
}
void assign_bit(char bit_arry[],unsigned bit_num,int val){
if(val==0){
*bit_arry&=~(1<<bit_num-1);
}
else{
*bit_arry|=(1<<bit_num-1);
}
}
5.
//1.mask求法(如何把要换数据的位置全部置为1且其他位全部为0) 其实就是类似于1->11111->000011111000 把所有的1移到要换数据的位置。用循环二进制加法得到11111 。然后<<end_bit位得到11111000...
//本题bit的存储格式为从右向左且从0开始计数
#include<stdio.h>
int store_bit_field(int original_val, int val_to_store, unsigned star_bit, unsigned end_bit)
{
//1 首先累加出11111 然后<<为111110000000....即可得到mask
unsigned mask=1;
int i=star_bit-end_bit;
while(i){
mask=(mask<<1)+1;
i--;
}
mask<<=end_bit;
//step2
original_val=~mask&original_val;
//step3
val_to_store<<=end_bit;
//4
val_to_store=val_to_store&mask;
//5
original_val|=val_to_store;
printf("%x",original_val);
}
int main(){
int orig_val,val_to_store;
unsigned int i,j;
orig_val=0xffff,val_to_store=0x123,i=15,j=4;
store_bit_field(orig_val,val_to_store,i,j);
}