C语言必会100题(11)。学习使用按位与 &/学习使用按位或 |/学习使用按位异或 ^/取一个整数a从右端开始的4~7位/学习使用按位取反~

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

51,学习使用按位与 &

  • 题目:学习使用按位与 &
  • 提示:0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1
  • 程序源代码:
    #include <stdio.h>
    
    int main()
    {
        int a, b;
    
        // 077八进制,等价于十进制的63,等价于二进制的0011 1111
        a = 077;
    
        // 3八进制,等价于十进制的3,等价于二进制的0000 0011
        // 也就是:0011 1111 & 0000 0011
        // 也就是:0000 0011
        // 也就是:3
        b = a & 3;
    
        printf("\40: The a & b(decimal) is %d \n", b);
    
        // 同理,找到7的二进制,按位与&比较即可
        // 7八进制,等价于十进制的7,等价于二进制的0000 0111
        // 也就是:0000 0011 & 0000 0111
        // 也就是:0000 0111
        // 也就是:7
        b &= 7;
        printf("\40: The a & b(decimal) is %d \n", b);
        
        return 0;
    }

52,学习使用按位或 |

  • 题目:学习使用按位或 |
  • 0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1
  • 程序源代码:
    #include <stdio.h>
    
    int main()
    {
        int a,b;
    
        // 077八进制,等价于十进制的63,等价于二进制的0011 1111
        a = 077;
    
        // 3八进制,等价于十进制的3,等价于二进制的0000 0011
        // 也就是:0011 1111 | 0000 0011
        // 也就是:0011 1111
        // 也就是:十进制的63
        b = a | 3;
    
        printf("\40: The a & b(decimal) is %d \n", b);
    
        // 同理,找到7的二进制,按位或|比较即可
        // 7八进制,等价于十进制的7,等价于二进制的0000 0111
        // 也就是:0011 1111 | 0000 0111
        // 也就是:0001 1111
        // 也就是:十进制的63
        b |= 7;
        printf("\40: The a & b(decimal) is %d \n", b);
    
        return 0;
    }

53,学习使用按位异或 ^

  • 题目:学习使用按位异或 ^
  • 提示:0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0
  • 程序源代码:
    #include <stdio.h>
    
    int main()
    {
        int a, b;
    
        // 077八进制,等价于十进制的63,等价于二进制的0011 1111
        a = 077;
    
        // 3八进制,等价于十进制的3,等价于二进制的0000 0011
        // 也就是:0011 1111 ^ 0000 0011
        // 也就是:0011 1100
        // 也就是:十进制的60
        b=a^3;
        printf("\40: The a & b(decimal) is %d \n", b);
        
        // 同理,找到7的二进制,按位异或^比较即可
        // 7八进制,等价于十进制的7,等价于二进制的0000 0111
        // 也就是:0011 1100 ^ 0000 0111
        // 也就是:0011 1011
        // 也就是:十进制的59
        b ^= 7;
        printf("\40: The a & b(decimal) is %d \n", b);
        
        return 0;
    }

54,取一个整数a从右端开始的4~7位

  • 题目:取一个整数a从右端开始的4~7位
  • 程序分析:可以这样考虑:
    • 先使a右移4位。
    • 设置一个低4位全为1,其余全为0的数。
    • 将上面二者进行&运算。
  • 程序源代码:
    #include <stdio.h>
    
    int main()
    {
        // 无符号类型,省略了int。也就等于unsigned int a, b, c, d;
        unsigned a, b, c, d;
        
        // 输入一个八进制数字
        printf("请输入一个八进制数字:");
        scanf("%o", &a);
    
        // 会将你输入的数字,首先转化为2进制。
        // 假如输入321(八进制),二进制为1101 0001。
        // 从右端开始的4~7位为:1101。
        b = a >> 4;
        // 设置一个低4位全为1,其余全为0的数。
        c =~ ( ~ 0 << 4);
        // 进行&(按位与)运算
        d = b & c;
    
        printf("输入的八进制数字为:%o\n", a);
        // 将1101转化为八进制输出为:15。
        printf("整数从右端开始的4~7位为:%o\n", d);
        
        return 0;
    }

55,学习使用按位取反~

  • 题目:学习使用按位取反~
  • 提示:~0=1; ~1=0;
  • 程序源代码:
    // 如对 a 按位取反,则得到的结果为 -(a+1)
    // 建议网上搜一下详细过程,可以看一下下面的文章
    // https://jingyan.baidu.com/article/cd4c2979cf6c6b346f6e6052.html
    // https://zhidao.baidu.com/question/1430762193706260179.html
    #include <stdio.h>
    
    int main()
    {
        // 234二进制1110 1010
        int a = 234, b;
    
        // 234 二进制:0000 1110 1010
        // 二进制原码即补码:0000 1110 1010
        // 取反后原码即补码:1111 0001 0101
        // 符号位为1,系统默认为正数补码
        // 先将补码减一:1111 0001 0100
        // 取反:1000 1110 1011
        // 换算:1110 1011换算为235
        // 最前面一位不用换算,直接为负数
        b =~ a;
    
        // decimal十进制的
        // 结果:-235
        printf("\40: The a's 1 complement(decimal) is %d \n", b);
    
    
        // 这个我也不清楚如何转换,不过我发现这样正好可以,但是应该不会是这样吧
        // 可以看一下,有很大的可能是错的,这种应该只是恰巧和结果一样
                    // 234 二进制:0000 1110 1010
                    // 二进制原码即补码:0000 1110 1010
                    // 取反后原码即补码:1111 0001 0101
                    // 换算16进制为:f15
        a =~ a;
        // hexidecimal十六进制
        // 结果:ffffff15
        printf("\40: The a's 1 complement(hexidecimal) is %x \n", a);
    
        return 0;
    }
    

     

posted @ 2022-03-20 21:19  炸天帮帮主  阅读(84)  评论(0编辑  收藏  举报