题目中涉及到了二进制中对某一位的三个操作,分别是:清零,置一,取反
①清零
如何让二进制中的某一位的值变为0而其他位保持不变呢?
这要涉及到了 按位与运算(都为1才为1) ,只要让这个二进制中的某一位的值对应的位数做和0的按位与运算,而其他的做1的按位与运算即可,以上题为例子:
②置一
如何让二进制中的某一位的值变为1而其他位保持不变呢?
这要涉及到了 按位或运算(有1即为1) ,只要让这个二进制中的某一位的值对应的位数做和1的按位或运算,而其他的做0的按位或运算即可,以上题为例子:
②取反
如何让二进制中的某一位的值取反而其他位保持不变呢?
这要涉及到了 按位异或运算(相同为0,不同为1) ,只要让这个二进制中的某一位的值对应的位数做和1的按位异或运算,而其他的做0的按位异或运算即可,(0 ^ 1 = 1 ,1 ^ 1 = 0 ,0 ^ 0 = 0 ,1 ^ 0 = 1 ,所以和1异或是取反,和0异或是不变)以上题为例子:
我们在C语言中想要以10进制、8进制和16进制输出很简单只需要在输出时用%d、%o,%x即可。
但是想要二进制输出就需要编写一个步骤了,快点抛弃你的取余符号,想想如何用位运算进行呢?
x & 01 相当于只保留了最低位,因为只有最低位是按位与运算保留,其他位都是清零。
而 ( x >> 1 ) & 01 相当于只保留了比最低位高一级的次级位数,以此类推,( x >> n ) & 01 相当于只保留了比最低位高n位的次级位数。
然后通过循环从最高位到最低位依次输出即可
实现代码如下:
- #include<stdio.h>
- #include<math.h>
-
- int main()
- {
- int x;
- x = 111; // 二进制为 01101111
- /*分别输出十进制,八进制,十六进制的值*/
- printf("%d %o %x\n", x, x, x);
- /*
- 十进制的数字以二进制的形式输出到控制台中
- x & 01 相当于只保留了最低位
- 而 ( x >> 1 ) & 01 相当于只保留了比最低位高一级的次级位数
- 然后从最高位到最低位依次输出即可
- */
- int temp = 0,n;
- while (x >= pow(2,temp)) // 得到十进制数转换为2进制需要循环几次
- {
- temp++;
- }
- printf("%d\n",temp);
- for (int i = temp; i >= 0; i--)
- {
- n = (x >> i) & 1; //从高位依次取出
- printf("%d",n);
- }
- return 0;
- }