偏偏wwW137ffcom却不管了,包含结ff14 探索笔记目的地137ff所有页面。

leetcode_137题——Single Number II(位运算) - 弱水三千12138 - 博客园
Single Number II
Question&Solution&
Given an array of integers, every element appears&three&times except for one. Find that single one.
Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Have you met this question in a real interview?&
& & & 这道题比较好,正好可以很好的复习一些位运算的相关知识
1.一个数组中有两个元素只出现一次,其他所有元素都出现两次,求这两个只出现一次的元素
[解题思路]
将数组所有元素都进行异或得到一个不为0的结果,根据这个结果中的不为0的某一位将数组分成两组
将两组中的元素进行异或,如两个数组的异或值都不为0,则得到最后结果
2.一个数组中有一个元素只出现1次,其他所有元素都出现k次,求这个只出现1次的元素
[解题思路]
当k为偶数时,同lss
当k为奇数时,将数组中每个元素的每一位相加mod k,得到结果即位出现1次的元素,时间复杂度O(nlen),空间复杂度为O(1)
&这里相加的是二进制的位,不是十进制的。比如K = 3,数据如下:69(1000101)出现1次, 33(100001)出现3次, 147()出现3次。那么运算按二进制逐位求和并模k。(++++++)mod(3) =&)。
++++++等于。每一位是1的个数。这已经不是二进制了。最后的结果是每一位mod(3),得到二进制表示 = 十进制63
上面是摘抄的别人的关于这道题的算法思想,,感觉很牛掰呀
一.逻辑运算符&
1.&&位与运算&
&1)&运算规则&
位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。例如:int型常量4和7进行位与运算的运算过程如下:
4=00 00 11= 00 0100
对于负数,按其补码进行运算。例如:例如:int型常量-4和7进行位与运算的运算过程如下:&-4=11 00 11= 00 0100
2)&典型应用&
清零:快速对某一段数据单元的数据清零,即将其全部的二进制位为0。例如整型数a=321对其全部数据清零的操作为a=a&0x0。&321=00 0 00
(2)&获取一个数据的指定位&
获取一个数据的指定位。例如获得整型数a=的低八位数据的操作为a=a&0xFF。321=
00 0001 & 0xFF =11 11111
获得整型数a=的高八位数据的操作为a=a&0xFF00。==a&0XFF00==
321=00 0001 & 0XFF00=00 0000
(3)保留数据区的特定位&&
保留数据区的特定位。例如获得整型数a=的第7-8位(从0开始)位的数据操作为:&
321=00 0001 & 384=00 0000
2. |&位或运算&
1)&运算规则&
位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。例如:int型常量5和7进行位或运算的表达式为5|7,结果如下:5= 00 0101
| 7= 00 00
2)&主要用途&
(1)&设定一个数据的指定位。例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF。321= 00 0001 | 11 00
逻辑运算符||与位或运算符|的区别&
条件&或&运算符&(||)&执行&bool&操作数的逻辑&或&运算,但仅在必要时才计算第二个操作数。&x || y , x | y&不同的是,如果&x&为&true,则不计算&y(因为不论&y&为何值,&或&操作的结果都为&true)。这被称作为&短路&计算。
3. ^&位异或&
&1)&运算规则&
位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。例如:int型常量5和7进行位异或运算的表达式为5^7,结果如下:5=00 0 11
2)&典型应用&
&(1)定位翻转&
定位翻转:设定一个数据的指定位,将1换为0,0换为1。例如整型数a=321,,将其低八位数据进行翻位的操作为a=a^0XFF;
(2)数值交换&
数值交换。例如a=3,b=4。在例11-1中,无须引入第三个变量,利用位运算即可实现数据交换。以下的操作可以实现a,b两个数据的交换:
4.~&位非&
位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。
二.位移运算符
左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例如int a,b;
则b=20,分析过程如下:
(a)10=(5)10=(00 0101)2
从上例可以看出位运算可以实现二倍乘运算。由于位移操作的运算速度比乘法的运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。
提示&将所有对2的乘法运算转换为位移运算,可提高程序的运行效率
位右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。例如:
int (a)10=(5)10=(00 0101)2
如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。可以看出位右移运算,可以实现对除数为2的整除运算。
提示&将所有对2的整除运算转换为位移运算,可提高程序的运行效率
3.复合的位运算符
在C语言中还提供复合的位运算符,如下:
&=、!=、&&=、&&=和^=
例如:a&=0x11等价于&a= a&0x11,其他运算符以此类推。
不同类型的整数数据在进行混合类型的位运算时,按右端对齐原则进行处理,按数据长度大的数据进行处理,将数据长度小的数据左端补0或1。例如char a与int b进行位运算的时候,按int&进行处理,char a转化为整型数据,并在左端补0。
补位原则如下:
1)&对于有符号数据:如果a为正整数,则左端补0,如果a&为负数,则左端补1。
2)&对于无符号数据:在左端补0。
#include&iostream&
#include&vector&
#include&math.h&
int singleNumber(vector&int&& nums) {
int ary[32]={0};
int res=0;
int len=nums.size();
for(int i=0;i&32;i++)
for(int j=0;j&j++)
if(((1&&i)&(nums[j]))!=0)
ary[i]=ary[i]%3;
res+=(ary[i]&&i);
int main()
vector&int&
vec.push_back(3);vec.push_back(2);vec.push_back(2);vec.push_back(2);
cout&&singleNumber(vec)&&
随笔 - 347产生/ASCII
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。美国标准信息交换代码是由美国国家标准学会(American National Standard Institute,ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization,ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。
表述方式/ASCII
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号。
标准I表/ASCII
SOH(start of headline)
STX (start of text)
ETX (end of text)
EOT (end of transmission)
ENQ (enquiry)
ACK (acknowledge)
BEL (bell)
BS (backspace)
HT (horizontal tab)
水平制表符
LF (NL line feed, new line)
VT (vertical tab)
垂直制表符
FF (NP form feed, new page)
CR (carriage return)
SO (shift out)
SI (shift in)
DLE (data link escape)
数据链路转义
DC1 (device control 1)
DC2 (device control 2)
DC3 (device control 3)
DC4 (device control 4)
NAK (negative acknowledge)
SYN (synchronous idle)
ETB (end of trans. block)
传输块结束
CAN (cancel)
EM (end of medium)
SUB (substitute)
ESC (escape)
换码(溢出)
FS (file separator)
文件分割符
GS (group separator)
RS (record separator)
记录分离符
US (unit separator)
单元分隔符
DEL (delete)
del ASCII码表
大小规则/ASCII
ASCII表1)数字0~9比字母要小。如"7"&"F";2)数字0比数字9要小,并按0到9顺序递增。如"3"&"8"3)字母A比字母Z要小,并按A到Z顺序递增。如"A"&"Z"4)同个字母的大写字母比小写字母要小。如"A"&"a"。记住几个常见字母的ASCII码大小:“换行LF”为0x0A;“回车CR”为0x0D;空格为0x20;"0"为0x30;"A"为0x41;"a"为0x61。另外还有128-255的ASCII字符。查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制),松开即可显示出对应字符。例如:按住ALT+97,则会显示出a。
国际问题/ASCII
ASCII是美国标准,所以它不能良好满足其它讲英语国家的需要。例如英国的英镑符号(£)在哪里?拉丁语字母表重音符号。使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语。汉字系统的中国象形汉字,日本和朝鲜。1967年,国际标准化组织(ISO:InternationalStandardsOrganization)推荐一个ASCII的变种,代码0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“为国家使用保留”,而代码0x5E、0x60和0x7E标为“当国内要求的特殊字符需要8、9或10个空间位置时,可用于其它图形符号”。这显然不是一个最佳的国际解决方案。因为这并不能保证一致性。但这却显示了人们如何想尽办法为不同的语言来编码的。
扩展/ASCII
ASCII扩展表1981年IBM PC ROM256个字符的字符集,即IBM扩展字符集。1985年11 Windows字符集被称作“ANSI字符集”,遵循了ANSI草案和ISO标准(ANSI/ISO7,简“Latin 1”。ANSI字符集的最初版本:1987年4月代码页437,字符的映像代码,出现在MS-DOS3.3。扩展ASCII 字符是从128 到255(0x80-0xff)的字符。扩展ASCII不再是国际标准。
双字节/ASCII
双字节字符集(DBCS:double-bytecharacterset),解决中国、日本和韩国的象形文字符和ASCII的某种兼容性。DBCS从256代码开始,就像ASCII一样。与任何行为良好的代码页一样,最初的128个代码是ASCII。然而,较高的128个代码中的某些总是跟随着第二个字节。这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。
虚拟值/ASCII
ASCIIESC键VK_ESCAPE(27)回车键:VK_RETURN(13)TAB键:VK_TAB(9)CapsLock键:VK_CAPITAL(20)Shift键:VK_SHIFT(16)Ctrl键:VK_CONTROL(17)Alt键:VK_MENU(18)空格键:VK_SPACE(32)退格键:VK_BACK(8)左徽标键:VK_LWIN(91)右徽标键:VK_RWIN(92)鼠标右键快捷键:VK_APPS(93)Insert键:VK_INSERT(45)Home键:VK_HOME(36)PageUp:VK_PRIOR(33)PageDown:VK_NEXT(34)End键:VK_END(35)Delete键:VK_DELETE(46)方向键(←):VK_LEFT(37)方向键(↑):VK_UP(38)方向键(→):VK_RIGHT(39)方向键(↓):VK_DOWN(40)F1键:VK_F1(112)F2键:VK_F2(113)F3键:VK_F3(114)F4键:VK_F4(115)F5键:VK_F5(116)F6键:VK_F6(117)F7键:VK_F7(118)F8键:VK_F8(119)F9键:VK_F9(120)F10键:VK_F10(121)F11键:VK_F11(122)F12键:VK_F12(123)NumLock键:VK_NUMLOCK(144)小键盘0:VK_NUMPAD0(96)小键盘1:VK_NUMPAD1(97)小键盘2:VK_NUMPAD2(98)小键盘3:VK_NUMPAD3(99)小键盘4:VK_NUMPAD4(100)小键盘5:VK_NUMPAD5(101)小键盘6:VK_NUMPAD6(102)小键盘7:VK_NUMPAD7(103)小键盘8:VK_NUMPAD8(104)小键盘9:VK_NUMPAD9(105)小键盘。:VK_DECIMAL(110)小键盘*:VK_MULTIPLY(106)小键盘+:VK_ADD(107)小键盘-:VK_SUBTRACT(109)小键盘/:VK_DIVIDE(111)PauseBreak键:VK_PAUSE(19)ScrollLock键:VK_SCROLL(145)
编程相关/ASCII
Pascal取得ASCII码:Ord(ch)得到对应字符:Chr(n)VisualBasic取得ASCII码:Asc(ch)得到对应字符:Chr(n)PCLOGO编程取得ASCII码:asc(某个字符,如大写的A)(输出答案:65)
代码算法/ASCII
ASCII非打印控制字符表在ascii中定义为,也就是十进制65,有了这个标准后,当我们输入A时,计算机就可以通过ascii码知道输入的字符的二进制编码是。而没有这样的标准,我们就必须自己想办法告诉计算机我们输入了一个A;没有这样的标准,我们在别的机器上就需要重新编码以告诉计算机我们要输入A。ascii码指的不是十进制,是二进制。只是用十进制表示习惯一点罢了,比如在ascii码中,A的二进制编码为,如果用十进制表示是65,用十六进制表示就是41H。在ascii码表中,只包括了一些字符、数字、标点符号的信息表示,这主要是因为计算机是美国发明的,在英文下面,我们使用ascii表示就足够了!但是在汉字输入下面,用ascii码就不能表示了,而汉字只是中国的通用表示,所以如果我们要在计算机中输入汉字,就必须有一个像ascii码的标准来表示每一个汉字,这就是中国的汉字国标码,它定义了汉字在计算机中的一个表示标准。通过这个标准,但我们输入汉字的时候,我们的输入码就转换为区位码,通过唯一的区位码得到这个汉字的字形码并显示出来。当然汉字的区位码在计算机中也是用二进制表示的。一、二进制数转换为十进制数二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所以,设有一个二进制数:,转换为10进制为:下面是竖式: 换算成 十进制第0位 0 * 20 = 0第1位 0 * 21 = 0第2位 1 * 22 = 4第3位 0 * 23 = 0第4位 0 * 24 = 0第5位 1 * 25 = 32第6位 1 * 26 = 64第7位 0 * 27 = 0&用横式计算为:0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 1000乘以多少都是0,所以我们也可以直接跳过值为0的位:1 * 22 + 1 * 23 + 1 * 25 + 1 * 26 = 100二、八进制数转换为十进制数八进制就是逢8进1。八进制数采用 0~7这八数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……所以,设有一个八进制数:1507,转换为十进制为:用竖式表示:1507换算成十进制。第0位 7 * 80 = 7第1位 0 * 81 = 0第2位 5 * 82 = 320第3位 1 * 83 = 512&同样,我们也可以用横式直接计算:7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839结果是,八进制数 1507 转换成十进制数为 839八进制数的表达方法C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或,那么它是八进制数还是10进制数,都有可能。所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,CtC++语言的数值表达的第二种进制法。现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:int a = 100;我们也可以这样写:int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。八进制数在转义符中的使用我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示Tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。比如,查一下第5章中的ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6。2。4小节的内容,大家仅仅了解就行。十六进制数转换成十进制数2进制,用两个阿拉伯数字:0、1;8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯数字:0到9;16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。假设有一个十六进数 2AF5, 那么如何换算成10进制呢用竖式计算:2AF5换算成10进制:第0位: 5 * 160 = 5第1位: F * 161 = 240第2位: A * 162 = 2560第3位: 2 * 163 = 8192&ASCII直接计算就是:5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997(别忘了,在上面的计算中,A表示10,而F表示15)现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100十六进制数的表达方法如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O)以下是一些用法示例:int a = 0x100F;int b = 0x70 + a;至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。十六进制数在转义符中的使用转义符也可以接一个16进制数来表示一个字符。如在6。2。4小节中说的 '?' 字符,可以有以下表达方式:'?' //直接输入字符'\77' //用八进制,此时可以省略开头的0'\0x3F' //用十六进制同样,这一小节只用于了解。除了空字符用八进制数 '\0' 表示以外,我们很少用后两种方法表示一个字符。三、十进制数转换到二、八、十六进制数进制数转换为2进制数给你一个十进制,比如:6,如果将它转换成二进制数呢?10进制数转换成二进制数,这是一个连续除2的过程:把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。“把要转换的数,除以2,得到商和余数”。那么:要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 (不要告诉我你不会计算6÷3!)“将商继续除以2,直到商为0……”现在商是3,还不是0,所以继续除以2。那就: 3 ÷ 2, 得到商是1,余数是1。“将商继续除以2,直到商为0……”现在商是1,还不是0,所以继续除以2。那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)“将商继续除以2,直到商为0……最后将所有余数倒序排列”好极!现在商已经是0。我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!6转换成二进制,结果是110。把上面的一段改成用表格来表示,则为:被除数 计算过程 商 余数6 6/2 3 03 3/2 1 11 1/2 0 1(在计算机中,÷用 / 来表示)如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:(图:1)请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。6。3。2 10进制数转换为8、16进制数非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。来看一个例子,如何将十进制数120转换成八进制数。用表格表示:被除数 计算过程 商 余数120 120/8 15 015 15/8 1 71 1/8 0 1120转换为8进制,结果为:170。非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。同样是120,转换成16进制则为:被除数 计算过程 商 余数120 120/16 7 87 7/16 0 7120转换为16进制,结果为:78。请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。四、十六进制数互相转换二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。我们也一样,只要学完这一小节,就能做到。首先我们来看一个二进制数:1111,它是多少呢?你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23 = 8,然后依次是 22 = 4,21=2, 20 = 1。记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)仅4位的2进制数 快速计算方法 十进制值 十六进值1111 = 8 + 4 + 2 + 1 = 15 F1110 = 8 + 4 + 2 + 0 = 14 E1101 = 8 + 4 + 0 + 1 = 13 D1100 = 8 + 4 + 0 + 0 = 12 C1011 = 8 + 4 + 0 + 1 = 11 B1010 = 8 + 0 + 2 + 0 = 10 A1001 = 8 + 0 + 0 + 1 = 10 9。。。。0001 = 0 + 0 + 0 + 1 = 1 10000 = 0 + 0 + 0 + 0 = 0 0二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。如(上行为二制数,下面为对应的十六进制): ,
, F D , A 5 , 9 B反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?先转换F:看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。接着转换 D:看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。所以,FD转换为二进制数,为: 由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:ASCII被除数 计算过程 商 余数 77 277 77/16 4 13 (D)4 4/16 0 4结果16进制为: 0x4D2然后我们可直接写出0x4D2的: 10。其中对映关系为:0100 -- 41011 -- D0010 -- 2同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。下面举例一个int类型的二进制数:11 我们按四位一组转换为16进制: 6D E5 AF 1B
汉字编码/ASCII
0-127 是 7位ASCII 码的范围,是国际标准。至于汉字,不同的字符集用的ascii 码的范围也不一样,常用的汉字字符集有GB2312-80,GBK,Big5,unicode 等。下面我重点说一说最常用的GB_2312 的字符集。GB_2312 字符集是目前最常用的汉字编码标准,windows 95/98/2000 中使用的 GBK字符集 就包含了GB2312,或者说和GB2312 兼容,GB_2312 字符集包含了 6763个的 简体汉字,和682 个标准中文符号。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254 (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。161-254 其实很好记忆,大家知道英文字符中,可打印的字符范围为33-126。将 这对 数加上128(或者说最高位置1),就得到汉字使用的字符的范围。//GB18030的规范是汉字第一个字节在0x81-0xFE之间,第二个字节位于区间0x40-0x7E以及0x80-0xFE。每个字节转化为整数大于128。if ((char_temp&=0x81)&&(char_temp&=0xFE)){if(*len{*len+=1;*p_temp++=char_temp;_putch(char_temp);x++;}}
进位制表/ASCII
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于www.baike.com。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:12次
参与编辑人数:10位
最近更新时间: 16:59:04
贡献光荣榜
扫码下载APP

我要回帖

更多关于 www.154ff.com 的文章

 

随机推荐