您的位置:首页 > 其它

位运算与ASCII码表

2015-11-01 13:06 302 查看
用一个函数 void  fun (char*)
{
}

将 char* 中的数字部分(非字母等)选择出来 ,并从小到大排序......

C/C++ code

?

我写的部分代码:
#include <stdio.h>

void fun(char *s){

static int i=0;

char arr[];

while(*s!='\0'){

if(*s>='0'&&*s<='9'){

printf("%c\t",s);

arr[i]=*s;

i++;

}

s++;

}

}

问题:*ch & 0xf;  //相当于*ch - '0',这样效率更高,对*ch & 0xf解释。

解析:

&是位运算,*ch & 0xf,按位与运算;这里就是把 *ch的前4位置0,文中说的是处理字符'0'到'9'时,ch & 0xf;相当于ch - '0';
'0' 到 '9'时,十六进制对应0x30到0x39, 所以与上0xf之后其十六机制刚好是0-9

针对字符0-9的,0-9的ascii码值为0x30,0x31,0x32 0x33 ...0x39,因此与0x0f按位与后只保留个位上的书即0x0,0x1,。。。0x9,只取二进制低四位。

&的运算符在这里表示位与运算符~具体一点就是比如 *ch = 0x37 = 00100111(二进制)
0xf = 1111
那么
0x30 & 0xf = 00100111 & 00001111 = 0x00000111 = 0x07
0x00100111
0x00001111
——————
0x00000111 

位运算是直接在内存中操作的,效率肯定高的
在32位操作系统中
*ch & 0xf
是取*ch的ASCII码来与0xf相与操作
例如: *ch = '0'时候,对应的ascii码为十进制48,
换成二进制位 0011 0000
oxf的二进制为0000 1111
这样与操作之后就是0。

根据ASCII码规律可知,大小写字母的规律就只有二进制位的第五位(0x20)有差别,大写字母该位为0,小写字母该位为1
所以大小写字母转换时只需要处理这一个bit位就OK了。

例如:将26个字母组成的字符串中的小写字母改成对应的大写字母,如果使用算术运算就要首先判断每个字母是否是小写字符,是小写字母的话再减去('a' - 'A')这么多,而如果使用位操作则不需要判断是大写还是小写,直接 ch &= ~0x20;即可。

C语音中的'\0'

‘\0’是c/c++语言中的字符串结束符,在ASCII字符集中对应数字0。\0是C++中字符串的结尾标志,存储在字符串的结尾。比如char
cha[5]表示可以放4个字符的数组,由于c/c++中规定字符串的结尾标志为'\0',它虽然不计入串长,但要占内存空间,而一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是
cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放4个字母(数组的长度必须比字符串的元素个数多1,用以存放字符串结束标志'\0')或者放2个汉字(1个汉字占2个字节,1个字母占一个字节),cha[5]占5个字节内存空间。

'\0'的ASCII是0

例如:

char sText[5];

sText[0]='a';

sText[1]='a';

sText[2]='a';

sText[3]='a';

sText[4]='\0';

cout<<sText<<endl; //这样输出就是4个a

// 如果数组的第五个元素即:

sText[4]='a';

cout<<sText<<endl; //这样输出就是5个a和一堆乱码,甚至跳出系统错误,因为没有字符串结尾符

附:

ASCII码表

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

  ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符,其中33个字符无法显示(这是以现今操作系统为依归,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符,控制字符的用途主要是用来操控已经处理过的文字,在33个字符之外的是95个可显示的字符,包含用键盘敲下空白键所产生的空白字符也算1个可显示字符(显示为空白)。

ASCII码大致可以分作三部分组成。
第一部分是:ASCII非打印控制字符
第二部分是:ASCII打印字符
第三部分是:扩展ASCII打印字符

ASCII码表 0-127

BinDecHex缩写/字符解释
00000000000NUL(null)空字符
00000001101SOH(start of headling)标题开始
00000010202STX (start of text)正文开始
00000011303ETX (end of text)正文结束
00000100404EOT (end of transmission)传输结束
00000101505ENQ (enquiry)请求
00000110606ACK (acknowledge)收到通知
00000111707BEL (bell)响铃
00001000808BS (backspace)退格
00001001909HT (horizontal tab)水平制表符
00001010100ALF (NL line feed, new line)换行键
00001011110BVT (vertical tab)垂直制表符
00001100120CFF (NP form feed, new page)换页键
00001101130DCR (carriage return)回车键
00001110140ESO (shift out)不用切换
00001111150FSI (shift in)启用切换
000100001610DLE (data link escape)数据链路转义
000100011711DC1 (device control 1)设备控制1
000100101812DC2 (device control 2)设备控制2
000100111913DC3 (device control 3)设备控制3
000101002014DC4 (device control 4)设备控制4
000101012115NAK (negative acknowledge)拒绝接收
000101102216SYN (synchronous idle)同步空闲
000101112317ETB (end of trans. block)传输块结束
000110002418CAN (cancel)取消
000110012519EM (end of medium)介质中断
00011010261ASUB (substitute)替补
00011011271BESC (escape)溢出
00011100281CFS (file separator)文件分割符
00011101291DGS (group separator)分组符
00011110301ERS (record separator)记录分离符
00011111311FUS (unit separator)单元分隔符
001000003220(space)空格
001000013321! 
001000103422" 
001000113523# 
001001003624$ 
001001013725% 
001001103826& 
001001113927' 
001010004028( 
001010014129) 
00101010422A* 
00101011432B+ 
00101100442C, 
00101101452D- 
00101110462E. 
00101111472F/ 
0011000048300 
0011000149311 
0011001050322 
0011001151333 
0011010052344 
0011010153355 
0011011054366 
0011011155377 
0011100056388 
0011100157399 
00111010583A: 
00111011593B; 
00111100603C< 
00111101613D= 
00111110623E> 
00111111633F? 
010000006440@ 
010000016541A 
010000106642B 
010000116743C 
010001006844D 
010001016945E 
010001107046F 
010001117147G 
010010007248H 
010010017349I 
01001010744AJ 
01001011754BK 
01001100764CL 
01001101774DM 
01001110784EN 
01001111794FO 
010100008050P 
010100018151Q 
010100108252R 
010100118353S 
010101008454T 
010101018555U 
010101108656V 
010101118757W 
010110008858X 
010110018959Y 
01011010905AZ 
01011011915B[ 
01011100925C\ 
01011101935D] 
01011110945E^ 
01011111955F_ 
011000009660` 
011000019761a 
011000109862b 
011000119963c 
0110010010064d 
0110010110165e 
0110011010266f 
0110011110367g 
0110100010468h 
0110100110569i 
011010101066Aj 
011010111076Bk 
011011001086Cl 
011011011096Dm 
011011101106En 
011011111116Fo 
0111000011270p 
0111000111371q 
0111001011472r 
0111001111573s 
0111010011674t 
0111010111775u 
0111011011876v 
0111011111977w 
0111100012078x 
0111100112179y 
011110101227Az 
011110111237B{ 
011111001247C| 
011111011257D} 
011111101267E~ 
011111111277FDEL (delete)删除
扩展ASCII码打印符

扩展的ASCII字符满足了对更多字符的需求。扩展的ASCII包含ASCII中已有的128个字符(数字0–32显示在下图中),又增加了128个字符,总共是256个。即使有了这些更多的字符,许多语言还是包含无法压缩到256个字符中的符号。因此,出现了一些ASCII的变体来囊括地区性字符和符号。例如,许多软件程序把ASCII表(又称作ISO8859-1)用于北美、西欧、澳大利亚和非洲的语言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: