• 操作符详解


    1.移位操作符

      << 左移操作符
      >> 右移操作符
      注: 移位操作符的操作数只能是整数。

    A.左移操作符

    移位规则:左边抛弃、右边补0
    1. #include
    2. int main()
    3. {
    4. int num = 10;
    5. int n = num<<1;
    6. printf("n= %d\n", n);
    7. printf("num= %d\n", num);
    8. return 0; }

    10的二进制表示:0000000000000000000000000001010

    记住,数字在计算机中存储的时候都是补码,由于10为正整数,故补码为其本身:0000000000000000000000000001010

    左移后为:0000000000000000000000000010100

    B.右移操作符

    移位规则:⾸先右移运算分两种:
    1. 逻辑右移:左边⽤0填充,右边丢弃
    2. 算术右移:左边⽤原该值的符号位填充,右边丢弃(大多数软件都是这种操作)。
    1. #include
    2. int main()
    3. {
    4. int num = 10;
    5. int n = num>>1;
    6. printf("n= %d\n", n);
    7. printf("num= %d\n", num);
    8. return 0; }
    警告⚠️:对于移位运算符,不要移动负数位,这个是标准未定义的。
    例如:
    1. int num = 10;
    2. num>>-1;//error

    2.位操作符:&、|、^、~

    位操作符有:

    1. & //按位与
    2. | //按位或
    3. ^ //按位异或
    4. ~ //按位取反
    注:他们的操作数必须是整数。

    直接上代码:

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int num1 = -3;
    5. int num2 = 5;
    6. printf("%d\n", num1 & num2);
    7. printf("%d\n", num1 | num2);
    8. printf("%d\n", num1 ^ num2);
    9. printf("%d\n", ~0);
    10. return 0; }

    A.按位与

    将原码转化为补码后,将两个补码对比看,如果均为1则为1,一个为0一个为1或均为0则该位为0。

    B.按位或

    将原码转化为补码后,将两个补码对比看,如果均为0则为0,一个为0一个为1或均为0则该位为1。

    补:xdx提示,这里可以用判断真假的并与或来记住。

    C.按位异或

    将原码转化为补码后,将两个补码对比看,如果该位不同则该位为1,如果该位相同则为0。

    D.按位取反

    这里不管符号位还是数字位统统取反。

    补充:这里的运算之后一定要注意都还是补码,一定要把它们换为原码哦!!!!!

    3.变态的面试题:

    不能创建临时变量(第三个变量),实现两个数的交换。

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a = 10;
    5. int b = 20;
    6. a = a^b;
    7. b = a^b;
    8. a = a^b;
    9. printf("a = %d b = %d\n", a, b);
    10. return 0; }

    编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。

    1. 参考代码:
    2. //⽅法1
    3. #include <stdio.h>
    4. int main()
    5. {
    6. int num = 10;
    7. int count= 0;//计数
    8. while(num)
    9. {
    10. if(num%2 == 1)
    11. count++;
    12. num = num/2;
    13. }
    14. printf("⼆进制中1的个数 = %d\n", count);
    15. return 0; }
    16. //思考这样的实现⽅式有没有问题?
    17. //⽅法2: #include <stdio.h>
    18. int main()
    19. {
    20. int num = -1;
    21. int i = 0;
    22. int count = 0;//计数
    23. for(i=0; i<32; i++)
    24. {
    25. if( num & (1 << i) )
    26. count++;
    27. }
    28. printf("⼆进制中1的个数 = %d\n",count);
    29. return 0; }
    30. //思考还能不能更加优化,这⾥必须循环32次的。
    31. //⽅法3: #include <stdio.h>
    32. int main()
    33. {
    34. int num = -1;
    35. int i = 0;
    36. int count = 0;//计数
    37. while(num)
    38. {
    39. count++;
    40. num = num&(num-1);
    41. }
    42. printf("⼆进制中1的个数 = %d\n",count);
    43. return 0;
    44. }
    45. //这种⽅式是不是很好?达到了优化的效果,但是难以想到。
    ⼆进制位置0或者置1
    编写代码将13⼆进制序列的第5位修改为1,然后再改回0
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a = 13;
    5. a = a | (1<<4);
    6. printf("a = %d\n", a);
    7. a = a & ~(1<<4);
    8. printf("a = %d\n", a);
    9. return 0; }

  • 相关阅读:
    总结 | Revit安装失败的常见问题及解决办法
    扩散模型 DDPM 核心代码梳理
    Oozie 集成 Sqoop
    卷积神经网络(CNN)原理与实现
    Github 自动化部署到github pages
    哪个编程语言实现hello world最烦琐?
    pyqt5实现串口工具
    数据结构之跳表
    百度地图 marker自定义图标并且删除指定的marker
    《ElementPlus 与 ElementUI 差异集合》el-button 属性 type=“text“ 被删除
  • 原文地址:https://blog.csdn.net/xdx2578/article/details/134471960