/**
1.int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.
如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001
*/
#include <stdio.h>
unsigned int intvert(unsigned int x, int p, int n)
{
//参数需要判断,p + n < ? && p、n都是大于0的数
int i = 0, temp = 1;
//循环使得特定位变化,改变一次x的特定位
for (i=0; i<n; i++)
{
temp <<= (p + i);
x ^= temp;
//使得temp重置为1,不能少
temp = 1;
}
return x;
}
int main(void)
{
unsigned int x = 0b00010001;
printf("转换后:%x.\n", intvert(x, 4, 3));
return 0;
}
3、下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位是1)中的大写字母转化为小写字母,找出其中的bug。
for (char *piterator=sz_word; *piterator!=0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator>='A' && *piterator<='Z')
piterator += 32;
}
以下是摘来的分析:(还没搞明白,先看完指针相关知识了回头再想想)
for (unsigned char *piterator = szWord; *piterator != '\0'; piterator++)
{
if ((*piterator >= 'A') && (*piterator <= 'Z')) {
//如果是大写字母
*piterator += 32;
}else if ((*piterator & 0x80)){
if (*(piterator+1) == '\0') {
//if the second character is null character
}else {
++piterator;
}
}
}
/*
代码的分析:
1.我使用unsigned char来替换char。
2.对于汉字字符,我们只知道它的第一个字符的特征,我们却不知道第二个字符的特征,这样就存在一些特殊的情况:
2.1 汉字的第二个字符是'\0'。我们有可能把这个字符看作是整个字符串的结束字符,也就是字符串的最后的一个字符。这时候如果我们试图跳过这个字符去获取它后面的字符,就会发生字符串的"越界"错误。为了避免这样的错误,如果汉字的第二个字符是'\0',就不跳过这个字符。
2.2 汉字的第二个字符是英文的大写字母。在原先的代码中如果检测到某个字符是汉字字符的第一个字符,会将指针调整到这个汉字字符的第二个字节,接着又判断这个字节是否是大写字母,这时候就有可能将这个字符看作是大写字母,这样就发生了错误。为了避免这样的错误,我将判断是否是大小字母的代码放到前面。
3.另外的一个错误就是,由于"!="的优先级大于"&"的优先级,原先的代码:
*piterator & 0x80 != 0
被编译器解析成:
(*piterator) & (0x80 != 0)
这样出来的结果就是错误的。为了避免这样的错误,我删除了"不等于0"的比较。
*/