位操作与中文字符问题

来源:互联网 发布:win7软件中文乱码 编辑:程序博客网 时间:2024/05/22 07:05

1.位操作

信息按位存储,占据空间小。但读取比较麻烦。

1)信息的按位存储

引例:

舞台上有八盏灯(1:亮,0:灭);

int status[8]={1,0,0,0,1,1,0,1};

char staus[]={1,0,0,0,1,1,0,1};

应用场景:嵌入式(GPIO,一位连接一根电线);

数据压缩编码

2)移位

位操作一般以unsigned char a=0x13;//00010011;

a>>2;//右移两位,000001000;

a<<2;//左移两位,01001100;

空则补零;移位相当于乘除法,但不绝对。

计算能力:对CPU而言,移位比乘除要快。

有符号数:补码等,一般不适用于工程问题。


3)取反操作和与操作

unsigned char b=0x12;//00010010;

unsigned char a=~b;//11101101;

'&':二元操作符:按位比较(全1为1);

应用场景:

(1)判断某一位的状态:

unsigned char flag= a& 0x10;//bit4为1

if(flag){

//亮

}

(2)按位清零

bit2,bit3清零,11110011:0xf3;

unsigned char a &=~(0x03);

(3)综合运用

int year =data[0]>>1;

int month=(data[0]&0x01)<<3+data[1]>>5;

int day=data[1]&0x1f;

4)或操作与base64编码

置1:a|0x08;

六十四(base):

unsigned char data[1024];

3字节转化为4字节

D[0]=data[0]>>2;

D[1]=(data[0]&0x03)<<4+data[1]>>4;

D[2]=(data[1]&0x0F)<<2+data[2]>>6;

D[3]=data[2]&0x3F;

2.中文问题

1)拉丁字符集

ASCII码:'A':65

alpha,beta无法用一个字节表示。

AScII码:0-127,最高位是0.

拉丁字符集:最高位为1.

2)中文字符集

GB2312->GBK(扩展)-》GB18030

BIG:繁体字,“CJK”:中日韩,Unicode统一码:0-0x10FFFF;

中文字符集:最高位也是1;

utf-8/utf-16;utf-32

3)字符编码转换

  (1)gbK->UTF-16

wchar_t宽字符。

char gbk[]="张三';

wchar_t text_utf[256]={0};

int n=MultiByteToWideChar(CP_ACP,0,gbk,strlen(gbk),text_utf,256);

(2)Unicode字符串到多字符串

char text_utf8[256];

int n2=WideCharToMultiByte(CP_UTF8,0,text_utf16,n1,text_utf8,256,NULL,0);//六个字符串。

0 0
原创粉丝点击