标签:右移 机内码 字节 int 左移 汉字 2030 HDoj
Problem Description 统计给定文本文件中汉字的个数。Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output 对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
Sample Input 2 WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa! 马上就要期末考试了Are you ready?
Sample Output 14 9
Author lcy
Source C语言程序设计练习(五)
Recommend lcy | We have carefully selected several similar problems for you: 2031 2032 2033 2034 2036 本题考查了汉字的机内码以及位运算
1机内码: 中文或西文信息在计算机系统中的代码表示称为机内码。ASCII码是一种西文机内码,用一个字节表示,其最高位均为0。汉字机内码用连续两个字节表示,为能和ACSII符号区分,每个字节的最高位是1。机内码和国标码的转换规则是:机内码 = 国标码+8080H =(区位码的十六进制表示)+A0A0H。显然,就是将国标码的两个字节的最高位均置为1即可。(转自csdn)
2如何区分中文机内码和西文机内码: 很显然,中文机内码每个汉字用连续的两个字节表示,且每个字节的最高位(也就是第8位)为1,而西文都是0,所以可以通过位运算辨别出来:
a 当第八位为1的字节与128位相与时,必然是10000000,也就是128
b当第八位为1的字节右移时此时要知道: 在C语言中
有符号数左移是逻辑左移,右移是算数右移。
无符号数左移右移都是逻辑的
逻辑左移和右移移出的空位都补0
算数左移都补0,算数右移补的是符号位,负数补1,正数补0
所以:因为要右移7位。这个7默认是int型,所以字节也变成了有符号数。字节的最高位又为1,说明是个负数,所以当右移7位时是算数右移,补1,必然是11111111。换算成有符号十进制整数也就是:-1
有了上述的两个判断条件,任意选择其一即可。
C语言代码如下:
#include<stdio.h> #include<string.h> int main() { int n=0; int num; scanf("%d",&n); getchar(); char s[200]; for(int i=0;i<n;i++) { num=0; gets(s); for(int j=0;j<(int)strlen(s);j++) { // printf("%d %d %d %d\n",s[j],s[j]&128,s[j]>>7 ,strlen(s)); //测试用句 if((s[j]&128)==128) //if((s[j]>>7)==-1) //两个式子都要加括号,经过测试发现位运算符'&','>>'的优先级小于双目运算符'==' num++; } printf("%d\n",num/2); } }
标签:右移,机内码,字节,int,左移,汉字,2030,HDoj 来源: https://www.cnblogs.com/wzmm/p/12590058.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。