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