C语言学习笔记——位运算
发布日期:2021-05-17 07:35:15 浏览次数:20 分类:精选文章

本文共 1356 字,大约阅读时间需要 4 分钟。

C语言学习笔记:位运算与进制

进制

编程中的进制通常有三种常用形式:二进制、十进制和十六进制。

  • 十进制是我们熟悉的日常计算方式,数字范围为0-9。
  • 十六进制常用于表示较大的数字,通常以字母A-F表示10-15。例如,0xA表示10,0xF表示15。十六进制数前缀通常为0x或0X,字母大小写不敏感。
  • 二进制是计算机内部存储数据的基本方式,只有0和1两种数字。

三种进制之间的转换主要采用基数相加法反转取余法。在实际操作中,两种方法常结合使用。


基数相加法

十进制与十六进制转换示例:

0xAB2转换为十进制:[2 \times 16^0 + B \times 16^1 + A \times 16^2]将0235(8)转换为十进制:[5 \times 8^0 + 3 \times 8^1 + 2 \times 8^2]将0xAB2转换为八进制:[2 \times 20^0 + 13 \times 20^1 + 12 \times 20^2]


反转取余法

十进制与八进制转换示例:

234转换为八进制:

  • 234 ÷ 8 = 29余2
  • 29 ÷ 8 = 3余5
  • 3 ÷ 8 = 0余3逆序排列为351
  • 0xAB2转换为八进制前需先转换为十进制,再进行反转取余。


    十、十六、两进制相互转换

    • 十进制与十六、八进制:反转取余法和基数相加法。
    • 二进制与八、十六进制:二进制位数与八进制位数的关系:
      • 每四位二进制组成一个十六进制位。
      • 每三位二进制组成一个八进制位。

    例如,二进制数1010011100001

    • 十六进制:AE1(取每四位)。
    • 八进制:012311(取每三位)。

    位运算符

    按位取反运算符

    运算符~表示对二进制进行补码运算:

    • ~1 == 0(二进制全1取反后为0)。
    • ~0 == 1(二进制全0取反后为1)。

    整数存储采用补码表示法:

    • 正数的补码是其本身。
    • 负数的补码是对二进制进行取反后加1。

    按位或、按位与运算符

    • 按位或运算符|
      • 1 | 1 == 1
      • 1 | 0 == 1
      • 0 | 0 == 0
    • 按位与运算符&
      • 1 & 1 == 1
      • 1 & 0 == 0
      • 0 & 0 == 0

    这些运算符与逻辑运算符&&||功能相似。


    按位异或运算符

    运算符^

    • 1 ^ 1 == 0
    • 0 ^ 0 == 0
    • 1 ^ 0 == 1

    浮点型无法直接使用,需通过联合体或强转换后操作。


    移位运算符

    • 左移<<和右移>>
      • 移动二进制位,移出位删除,移入位补0。
      • 负数右移可能行为不定,需谨慎使用。

    位字段

    位字段用于对特定位进行操作,适合低层控制。

    struct Bit {    int b8:1; // 第8位    int b7:1;    int b6:1;    int b5:1;    int b4:1;    int b3:1;    int b2:1;    int b1:1;} B;
    • 成员类型intunsigned int
    • 小端存储:b8是右边第一位。
    • 操作示例
      • B.b8 = 1设置最右边第一位为1。
      • B.b3 = 3会报错,系统自动修正为1。

    总结

    位运算是C语言中的基础知识,理解其原理和应用是编程的重要基础。通过位运算符和位字段,可以灵活控制数据的二进制形式,优化程序性能。

    上一篇:C语言学习笔记——文件操作
    下一篇:C语言学习笔记——多文件

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年05月05日 19时24分39秒