进制、位运算及结构体

进制、位运算及结构体


参考教程:

二进制转换成十六进制

进制固定格式:二进制0B、十六进制0X、十进制直接写数字

例:二进制0B1111、十六进制0XOF、十进制15

进制的转换:
在这里插入图片描述
二进制转换十六进制:
一位十六进制数等于4位二进制数,可以通过8421码来计算,从左至右四位一组,不够分配左边补0
在这里插入图片描述
进制转化也可通过计算器来完成:
在这里插入图片描述

结构体

结构体是把多个不同类型的数据集合在一个类型之中。
在这里插入图片描述
C语言中的集合数据类型:结构体和数组。
在这里插入图片描述
结构体的定义:

方法一:先定义结构类型,后说明结构变量
struct 结构名
{
    成员列表
};

方法二:在定义结构类型的同时说明结构变量
struct 结构名
{
    成员列表
} 结构变量;

如:
在这里插入图片描述
结构体的使用:

  • 定义结构体

  • 写入数据

  • 数据调用
    在这里插入图片描述
    前缀typedef:
    typedef 是一种关键字,可以使用它来为类型取一个新的名字,

    typedef关键字的书写规则:
    1、用类型定义变量名;
    2、在定义变量名之前加上typedef关键字。

    如:

    typedef unsigned char BYTE;
    // 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:
    BYTE b1, b2;
    

    可参考:C typedef
    结构体中加入关键字typedef:
    在这里插入图片描述

位运算

  • 定义:位运算就是直接对整数在内存中的二进制位进行操作。由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

  • 概述:
    在这里插入图片描述
    可参考:

  • 无符号右移(>>>)
    无符号右移则始终补0,不考虑正负数。

  • 异或运算性质:

    1、交换律
    2、结合律 (a ^ b) ^ c == a ^ (b ^ c)
    3、对于任何数x,都有 x ^ x=0,x ^ 0 = x
    4、自反性: a ^ b ^ b=a ^ 0 = a;

  • 左移和右移
    左移,相当于乘以2;右移,相当于除以2

    • 左移:各二进位全部左移若干位,高位丢弃,低位补0
             125   <<    3
      左移:    
            0 1 1 1 1 1 0 1
            ---------------
          0|1 1 1 1 1 0 1 0  << 1
        0 1|1 1 1 1 0 1 0 0  << 2
      0 1 1|1 1 1 0 1 0 0 0  << 3
                      ^ ^ ^
                       补0
      结果: 125<<3 = 1110 1000 = -24(八位)       
            125<<3 = 1110 1000 = 1000(十六位)
      相当:125*2的3次方(若左移时舍弃的高位不包含1)
      
    • 右移:各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
       125   >>    3
      右移:    
      0 1 1 1 1 1 0 1
      ---------------
      0 0 1 1 1 1 1 0 |1     >> 1
      0 0 0 1 1 1 1 1 |0 1   >> 2
      0 0 0 0 1 1 1 1 |1 0 1   >> 3
      ^ ^ ^ 
      正数补0负数补1
      结果: 125>>3 = 0000 1111 = 15
      等价与 125/2的3次方的商
      
      用Dev-C++运行后结果为:
      在这里插入图片描述
  • 位运算用途

    • 与运算:
      1)清零
      如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
      2)取一个数的指定位
      比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
      3)判断奇偶
      只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 = = 0)来判断a是不是偶数。
    • 或运算
      常用来对一个数据的某些位设置为1
      比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
    • 异或运算
      1)翻转指定位
      比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
      2)与0相异或值不变
      例如:1010 1110 ^ 0000 0000 = 1010 1110
      3)交换两个数
      如:
      void Swap(int &a, int &b){
          if (a != b){
              a ^= b;  // 相当于a=a^b
              b ^= a;
              a ^= b;
          }
      }
      
      运行结果如下:
      在这里插入图片描述
    • 取反运算
      使一个数的最低位为零
      使a的最低位为0,可以表示为:a & 1。1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值