C语言学习笔记系列(2)位运算

为了节省空间(这个应该是最初在C语言中使用bit操作的主要原因),当某些变量只会取有限几种值,这时就可以使用几个bit位进行数据的存储。

例如:00000000这是一个char大小的二进制值,假设我们需要8flag,每个flag只会取0或者1,这样的值(当然不限于01,也可以是任意的值,只要只有两种),这是就可以用每个bit位来代表一个flag。还有,如果flag可以取三个值,那么可以用两个bit位来存储flag

为了取得flag的值,这是就需要使用位运算了。为了便于理解偏移,下面的数据基本上都是使用十六进制方式表示。

例如: char a = 0x8000; 其中第一个bit位代表flag1,那么a >>7就可以得到flag1的值为1

下面再举例说明一下位偏移的用法。

#include <stdio.h>

#include <stdlib.h>

int main()

{

int a = 0x1234;

int b = 0x5678;

 

printf("a>>>8: %x/n", a >> 8);

printf("b<<8: %x/n", b << 8);

return 0;

}

运行结果为:

a>>8: 12

b<<8: 567800

除了上面的使用方式外,还有一种不用偏移就可以取得bit位值的方式,那就是把bit位作为结构体的成员变量来使用。其类型可以是intshort或者char之类的整形。

例如:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct sbit {

      char a:7;

      char b:1;

      char c;

};

int main()

{

      struct sbit sbit;

 

      memset(&sbit, 0, sizeof(sbit));

      sbit.a = 0x7E;

      sbit.b = 1;

      sbit.c = 0x34;

      printf("sbit.a: %x/n", sbit.a);

      printf("sbit.b: %x/n", sbit.b);

      printf("sbit.c: %x/n", sbit.c);

      return 0;

}

运行结果为:

sbit.a: 7e

sbit.b: 1

sbit.c: 34

如果给bit型变量赋值超过其表示范围,则值为0.这点儿与一般类型的变量不同。

例如:

int main()

{

      struct sbit sbit;

 

      memset(&sbit, 0, sizeof(sbit));

      sbit.a = 0x80;

      sbit.b = 2;

      sbit.c = 0x134;

      printf("sbit.a: %x/n", sbit.a);

      printf("sbit.b: %x/n", sbit.b);

      printf("sbit.c: %x/n", sbit.c);

      return 0;

}

运行结果为:

sbit.a: 0

sbit.b: 0

sbit.c: 34

其他的位运算还有:按位与&、按位或|、按位异或~ 、按位取反~ 等,都是需要把数据转成基本的二进制后才能进行计算,相对来说也比较容易理解,这里就不再赘述了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值