《c和指针》第五章 编程练习答案

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);
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值