Chinaunix

标题: 问一个关于小问题,&0x80 [打印本页]

作者: spirit_mly    时间: 2009-08-04 16:27
标题: 问一个关于小问题,&0x80
记得以前好像问过,但是后来就不了了之了,唉,,,今天再次来论坛里,烦劳大家帮给点想法,呵呵
说正题:
是在phpcms里面看见的,术语我不知道叫什么,就是segment(是切词吗?)
它用ord($str)&0x80来判断汉字,这个是为什么呢?能说详细点吗?
这个&0x80是什么东东啊?
----------
数学不好,看见数字就头疼... ...

[ 本帖最后由 spirit_mly 于 2009-8-4 16:31 编辑 ]
作者: zhaiduo    时间: 2009-08-04 16:27
80对应的二进制代码为1000   0000,最高位为一,代表汉字.汉字编码格式通称为10格式.  
  一个汉字占2字节,但只代表一个字符

http://topic.csdn.net/t/20040416/10/2972001.html
作者: spirit_mly    时间: 2009-08-04 16:57
标题: 回复 #2 zhaiduo 的帖子
谢谢啦,呵呵,有点明白了,至于细节的研究似乎需要以后再说了,呵呵
作者: 网鬼    时间: 2009-08-04 17:20
0x80表示16进制数80,转换为十进制为128,转换为二进制为:10000000
ord($str)得到字符的ASCII值,然后与0x80进行&(位与)运算
按照汉字的高位为1的说法,所有高位不为1的字符和二进制10000000进行&运算后的结果都为0,即不为中文字符,相反,只要高位为1的字符,ord($str)&0x28的结果都是128(10000000)
有点晕,不知道说明白没,我也搞得不是十分清楚,主要的是位运算,其实这种技巧在C里的应用比较多
作者: 网鬼    时间: 2009-08-04 17:26
哦,额的神呀,接了个电话,回得慢了点,最佳就被别人抢了,哭
作者: bs    时间: 2009-08-04 17:41
厉害厉害  
作者: spirit_mly    时间: 2009-08-05 09:30
原帖由 网鬼 于 2009-8-4 17:26 发表
哦,额的神呀,接了个电话,回得慢了点,最佳就被别人抢了,哭

鬼兄,么急、么急,回来我再开一贴,第一时间告诉你,而且最佳都是内定的,嘿嘿,如何?
作者: lifeistrue    时间: 2009-09-16 16:32
不错!
作者: sunceenjoy    时间: 2009-09-21 09:54
"Windows中,中文简体字符集的编码是同时用1个字节和2个字节来表示的。当高位是0x00~0x7f时,为一个字节,高位为0x80以上时用2个字节表示"

注:括号里面都是2进制

当你发现一个字节的内容大于0x7f,那它肯定是个(跟另外一个字节拼凑成一个)汉字,如何判断肯定大于0x7f呢?
0x7f(1111111)后面一个数就是0x80(10000000),所以想要大于0x7f,这个字节的最高位都肯定是1,我们只需要判断这个最高位是否为1就行了。

判断方法:
位与(相同的位都是1的才为1,否则为0):
如:要判断一个数的第三位是否是1,只要跟4(100)位与,判断一个数的第2位是否为1就跟2(10)位与.
同理判断第八位是否为1只要跟(10000000)也就是0x80位与了.

这里为什么不用>0x7f,php可能还行,但在其他强类型语言里面,1个字节的最高位用来标示负数,一个负数肯定不可能大于0x7f(最大的整数)


再举个例子:
a的assic码是97(1100001)
A的assic码是65(1000001)

b的assic码是98(1100010)
b的assic码是66(1000010)

发现一个规律:一个a-z的字母,只要是小写字母,第六位肯定是1,我们可以用这个来判断大小写:
这时候只要跟用以个字母跟0x20(100000)来位与判断:
if(ord($a)&0x20){
        //大写
}

如何把所有字母改成大写?第六位的1改成0就行了:
$a='a';
$a        = chr(ord($a)&(~0x20));
echo $a;
作者: renxiao2003    时间: 2009-10-22 15:26
PHP里对汉字的处理问题吧。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2