• 《C和指针》学习笔记[第五章 操作符与表达式]


    5.8问题

    1.

    2.0

    2.

    答案不唯一,我的机器输出为9

    3.

    移位操作符与位操作符本人操作比较少,我就知道子网掩码与ip做位运算,可以知道是否同一个子网

    4.

    两个速度一样

    5.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "t_c.h"
    
    int main(void)
    {
    
        int leap_year;
        int year;
        scanf("%d", &year);
        
        leap_year = (year % 4 ==0 && year % 100 !=0) || year % 400 == 0 ? 1 : 0;
        printf("%d\n", leap_year);
        
        
        
        return EXIT_SUCCESS;
    }

    6.

    该题目我摘抄的信息 C 语言中,术语副作用是指对数据对象或者文件的修改。

    任何一个操作符本身应该有返回值,所谓的副作用用就是改变了对象。

    所以=, ++,--,+=等复合操作符,都对变量本身进行了操作,比如a=1,该表达式的返回值为a,但副作用是把a的内容修改了,另外的同理。

    7.

    显示 In range,因为 1<=a为1,1<=10为1,所以显示if条件为真的情况

    8.

    整个代码,我感觉已经比较简洁了,并没有消除多余代码的必要

    9.

    我觉得能

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "t_c.h"
    
    #define ARRAY_SIZE 10
    
    int main(void)
    {
    
        int non_zeroo = 0;
        int array[ARRAY_SIZE] = {0};
        int i;
        for (i = 0; i < ARRAY_SIZE; i += 1) {
            non_zeroo += array[i];
        }
        if (!non_zeroo) {
            printf("Value are all zero\n");
        }
        else
            printf("There are non zero values\n");
        
        return EXIT_SUCCESS;
    }

    10.

    a -25 b -25 c 9 d 1 e 4

    f -2 [f -5] g 20[ g 40] h  -3 [ h -4]i 1 j 0[j 10]

    12.

    本电脑为算数移位,因为-2右移一位变成了-1,如果为逻辑移位,最高位补0应该变成正数

    5.9 编程练习

    1.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "t_c.h"
    
    
    
    int main(void)
    {
        
        int ch;
        while ((ch = getchar()) != EOF) {
            if (ch >= 'A' && ch <= 'Z') {
                ch += 'a' - 'A';
            }
            putchar(ch);
        }
        
        
        
        return EXIT_SUCCESS;
    }

    2.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "t_c.h"
    
    
    
    int main(void)
    {
        
        int ch;
        while ((ch = getchar()) != EOF) {
            if (ch >= 'A' && ch <= 'Z'){
                ch += 13;
                if (ch > 'Z') {
                    ch = ch  % 'Z' + 'A';
                }
                
            }
            else if (ch >= 'a' && ch <= 'z'){
                ch += 13;
                if (ch > 'z') {
                    ch = ch  % 'z' + 'a';
                }
            }
            putchar(ch);
        }
        
        
        
        return EXIT_SUCCESS;
    }

    3.[摘抄来至网上的答案,确实是非常好的思路]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    #include "t_c.h"
    unsigned int reverse( unsigned int value )
    {
      unsigned int answer = 0;
      unsigned int i;
    
      /*
      用i来控制循环的次数,利用位操作,增加程序的可移植性,
      用1的常数来判断移尾确实思路很好
      for( i = 1; i != 0; i <<= 1)
      */
      for ( i = 1; i != 0 ; i <<= 1) {
        answer <<= 1;
        if( value & 1 )
          answer |= 1;
        value >>= 1;
      }
    
      return answer;
    }
    
    int main(void)
    {
        printf("%u\n", reverse(25) );
    
        return EXIT_SUCCESS;
    }

    4.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    #include "t_c.h"
    void
    set_bit(char bit_array[], unsigned bit_number)
    {
        signed char ch, o_ch = 1, i;
        int index, offset;
        index = (bit_number-1) / 8;
        offset = bit_number % 8;
    //    printf("%d, %d \n", index, offset);
        ch = bit_array[index];
        for (i = 0; i < 8 - offset; i++) {
            o_ch <<= 1;
        }
        ch |= o_ch;
        bit_array[index] = ch;
    }
    
    void
    clear_bit(char bit_array[], unsigned bit_number)
    {
        signed char ch, o_ch = 0, i;
        int index, offset;
        index = (bit_number-1) / 8;
        offset = bit_number % 8;
        ch = bit_array[index];
        for (i = 0; i < 8; i++) {
            
            if (i == offset) {
                o_ch |= 0;
            }
            else
                o_ch |= 1;
            
            o_ch <<= 1;
        }
        ch &= o_ch;
        bit_array[index] = ch;
    }
    
    
    void
    assign_bit(char bit_array[], unsigned bit_number, int value)
    {   // 调用前面定义好的函数
        if (value) {
            set_bit(bit_array, bit_number);
        }
        else
            clear_bit(bit_array, bit_number);
    }
    
    int
    test_bit(char bit_array[], unsigned bit_number)
    {
        signed char ch, o_ch = 0, i;
        int index, offset;
        index = (bit_number-1) / 8;
        offset = bit_number % 8;
        ch = bit_array[index];
        
        for (i = 0; i < 8; i++) {
            
            if (i == offset) {
                o_ch |= 1;
            }
            else
                o_ch |= 0;
            
            o_ch <<= 1;
        }
        
        ch &= o_ch;
        ch = ch ? 1: 0;
        
        return (int) ch;
    }
    
    int main(void)
    {
        int c;
        char string[] = "Hello";
        c = test_bit(string, 2);
        printf("%d\n", c);
    
        return EXIT_SUCCESS;
    }

    上面我写的,好像对题目理解错误了,尴尬。这是人家正确的理解:

    #include<stdio.h>
    #include<string.h>
    
    void set_bit( char bit_array[], unsigned int bit_number )
    {
        int length = strlen( bit_array );
        if( bit_number < length )
        {
          bit_array[length - bit_number - 1] = '1';
        }
    }
    
    void clear_bit( char bit_array[], unsigned int bit_number )
    {
      int length = strlen( bit_array );
      if( bit_number < length )
      {
        bit_array[length - bit_number - 1] = '0';
      }
    }
    
    void assign_bit( char bit_array[], unsigned int bit_number, int value )
    {
      int length = strlen( bit_array );
      if ( bit_number < length )
      {
        if ( value == 0)
        {
          bit_array[length - bit_number - 1] = '0';
        }
        else if( value == 1)
        {
          bit_array[length - bit_number - 1] = '1';
        }
      }
    }
    
    int test_bit( char bit_array[], unsigned bit_number )
    {
      int length = strlen( bit_array );
      if ( bit_number < length )
      {
        if ( bit_array[bit_number] != '0')
        {
          return 1;
        }
        else
        {
          return 0;
        }
      }
    }
    int main(int argc, char const *argv[]) {
      char str[] = "0000";
      set_bit( str, 1 );
      printf("%s\n", str );
      return 0;
    }

    应该是通过字符串模拟一串二进制数据,我想复杂了

    5.摘操至:https://github.com/Stephan14/Pointers_On_C/blob/master/ch5/p5.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    
    #define INI_BITS ( CHAR_BIT * sizeof(int) )
    /*
      已经经过测试该编译器中规定int为4个字节
    */
    
    int creat_mask( int starting_bit, int ending_bit )
    {
      /*为保证进行逻辑移位而不是算术移位,将掩码声明为无符号类型
       * 通过有符号的-1,二进制全1,左右移位,形成掩码确实思路不错,书上给了提示。我还是没想到
       */
      unsigned int mask = (unsigned)-1;//强制类型转换
      mask >>= INI_BITS - (starting_bit - ending_bit + 1 );
      mask <<= ending_bit;
      return mask;
    }
    
    
    
    // 这里就比较简单,按照书中逻辑操作
    int store_bit_field( int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit )
    {
      unsigned int mask = creat_mask( starting_bit, ending_bit );
      original_value &= ~mask;
      value_to_store <<= ending_bit;
      return original_value | (value_to_store & mask);
    }
    
    int main(void)
    {
        int i = 0xffff;
    
      printf("%x\n", store_bit_field( i, 0x123, 13, 9) );
      return 0;
    }

    本章学习对于位运算,我还是太陌生了,而且对于有符号数,与无符号数的认知也比较少。

  • 相关阅读:
    移除jboss响应中的中间件信息
    Cypress web自动化1-windows环境npm安装Cypress
    pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告
    pytest文档38-allure.step()添加测试用例步骤
    python笔记45-经典面试题:判断字符串括号是否闭合{}[]()
    Linux学习28-linux一行命令杀掉指定名称进程(killall 、kill 、pkill)
    pytest文档37-自定义用例顺序(pytest-ordering)
    pytest文档36-断言失败后还能继续执行pytest-assume
    pytest文档35-Hooks函数之统计测试结果(pytest_terminal_summary)
    pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)
  • 原文地址:https://www.cnblogs.com/sidianok/p/16342067.html
Copyright © 2020-2023  润新知