(三十三)位操作

一个字节由8个位表示,0000 0000 == 0 == 0x00,0000 0001 == 1 == 0x01......1111 1111 == 255 == 0xFF

从左到右称为bit7,bit6,bit5...bit0

引例1

舞台上有8盏灯,用1表示亮,0表示灭

  • 第一种方法

    int status[8] = {1,0,0,1,0,0,0,1};//32个字节
    
  • 第二种方法

    char status[8] = {1,0,0,1,0,0,0,1};//8个字节
    

显然,第二种占用空间小

利用位bit来表示信息,占用空间可以更小

unsigned char status = 0x91;  //1001 0001,仅需一个字节!

引例2

用变量表示在校学生的出生年月日

  • 第一种方法

    int year = 1982,month=10,day=23;//需要12字节
    
  • 第二种方法

    short year = 1982;char month = 10;char day = 23;//需要4字节,short要2个字节
    

用7个位表示年000 0000 - 111 1111(0-127):将1982记为82

用4个位表示月0000-1111(1-15)

用5个位表示日0 0000-1 1111(0-31)

上面的一共才需要16位,即2个字节

优点与缺点

  • 优点:占用空间小
  • 缺点:读写麻烦,不容易修改/读取其中一个位的状态

应用场景

嵌入式(GPIO,一个位连着一个电线)

数据压缩编码(音视频,网络协议)

移位

位操作是对无符号数进行操作的

unsigned char a = 0x13;
//0001 0011 -> 0100 1100,左侧移出,右侧补0
unsigned char b = a << 2;
//0001 0011 -> 0000 0100,右侧移出,左侧补0
unsigned char c = a >> 2;
unsigned int flag = 1u << 7;
//1是int类型的,1u才算unsigned int类型的,这里为1u

左移一位相当于乘2

右移一位相当于除2

移位运算比乘除运算速度更快,节省资源

移位并赋值运算符:<<= 、 >>=

a <<= 2相当于a = a << 2

有符号整数的移位没有实际意义

char c = 1;
c = c << 7;
//c应该是1000 0000,但是他的结果却是-128

取反

unsigned char a = 0x13;//0001 0011
unsigned char b = ~a;  //1110 1100

与操作

unsigned char result = a & b;
应用场景1:判断某位的值
unsigned char a = 0x13;//0001 0011

怎么判断bit4是亮还是灭

unsigned char flag = status & 0x10;//0001 0000
if(flag)
{
    //亮
}

怎么判断应该任意位的值

bool checkBit(unsigned char a,int N)
{
    unsigned char mask = 1u << N;//1左移N位
    return a & mask;
}

例如a为0001 0011求bit2,N为2

mask就变成0000 0100,a&mask为0001 0011 & 0000 0100为0,故bit2为0

应用场景2:按位清零
unsigned char a = 0x6A;//0110 1010

要把bit2和bit3设为0,只要a&0xF3就行(0xF3为1111 0011,是凑出来的)

应用场景3:读取多个位
unsigned char a = 0x6A;//0110 1010

要取出bit2...bit5怎么做

  • 右移两位,0110 1010->0001 1010

    unsigned char b = a >> 2;
    
  • 高位清0,0001 1010->0000 1010

    unsigned char c = b & 0x0F;
    

合在一起

unsigned char result = (a>>2)&0x0F;
综合应用:读取年月日
//1982,10,23
//年82,月10,日23
//上面有,高7位表示年,后面4位为月,最后5位为日,共两个字节
//1010010 1010 10111
//合起来分成2个字节
//10100101 01010111
//即为0xA5,0x57

unsigned char data[2] = {0xA5,0x57};
int year = data[0]>>1;
int month = ((data[0]&0x01)<<3)+(data[1]>>5);
int day = data[1]&0x1F;

或操作

unsigned char result = a | b;
应用场景:置1
unsigned char status = 0x13;//0001 0011
//让bit4亮起来
status |= 0x10;
//让bit2...bit4亮起来
status |= 0x1C;

位操作应用:base64编码

64进制

base64就是64进制,包括以下字符

A..Z , a..z , 0..9 , + /

26+26+10+2=64

1/代表的十进制为53*64+63

base64编码:将任意数据转化为文本

规则:每6位一组,转成base64字符

unsigned char data[1024];

例如

4D 5A 90->01001101 01011010 10010000

划分为4组->010011 010101 101010 010000

得到4个数,每个数介于(000000-111111)(0-63)之间

再以64进制表示19(T),21(V),42(q),16(Q)

故为TVqQ

AfBase64

实现base64编码的类,与加密解密有关

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容