免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6855 | 回复: 8
打印 上一主题 下一主题

问一个关于小问题,&0x80 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-04 16:27 |只看该作者 |倒序浏览
10可用积分
记得以前好像问过,但是后来就不了了之了,唉,,,今天再次来论坛里,烦劳大家帮给点想法,呵呵
说正题:
是在phpcms里面看见的,术语我不知道叫什么,就是segment(是切词吗?)
它用ord($str)&0x80来判断汉字,这个是为什么呢?能说详细点吗?
这个&0x80是什么东东啊?
----------
数学不好,看见数字就头疼... ...

[ 本帖最后由 spirit_mly 于 2009-8-4 16:31 编辑 ]

最佳答案

查看完整内容

80对应的二进制代码为1000 0000,最高位为一,代表汉字.汉字编码格式通称为10格式. 一个汉字占2字节,但只代表一个字符http://topic.csdn.net/t/20040416/10/2972001.html

论坛徽章:
0
2 [报告]
发表于 2009-08-04 16:27 |只看该作者
80对应的二进制代码为1000   0000,最高位为一,代表汉字.汉字编码格式通称为10格式.  
  一个汉字占2字节,但只代表一个字符

http://topic.csdn.net/t/20040416/10/2972001.html

论坛徽章:
0
3 [报告]
发表于 2009-08-04 16:57 |只看该作者

回复 #2 zhaiduo 的帖子

谢谢啦,呵呵,有点明白了,至于细节的研究似乎需要以后再说了,呵呵

论坛徽章:
0
4 [报告]
发表于 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里的应用比较多

论坛徽章:
0
5 [报告]
发表于 2009-08-04 17:26 |只看该作者
哦,额的神呀,接了个电话,回得慢了点,最佳就被别人抢了,哭

论坛徽章:
0
6 [报告]
发表于 2009-08-04 17:41 |只看该作者
厉害厉害  

论坛徽章:
0
7 [报告]
发表于 2009-08-05 09:30 |只看该作者
原帖由 网鬼 于 2009-8-4 17:26 发表
哦,额的神呀,接了个电话,回得慢了点,最佳就被别人抢了,哭

鬼兄,么急、么急,回来我再开一贴,第一时间告诉你,而且最佳都是内定的,嘿嘿,如何?

论坛徽章:
0
8 [报告]
发表于 2009-09-16 16:32 |只看该作者
不错!

论坛徽章:
0
9 [报告]
发表于 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;

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
10 [报告]
发表于 2009-10-22 15:26 |只看该作者
PHP里对汉字的处理问题吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP