The C programing language 第二章课后题

操作符优先级

The C programing language 第二章课后题_第1张图片

/*第二章 类型,运算符与表达式 1. 类型主要有 char short int long float double 其中,又分为unsigned signed 俩种类型,就是我们常说的无符号和有符号, 无符号表示的都是正数或者0,有符号就可以表示正数,负数. 当然了还要 const 常量,第一次被赋值之后就不能再修改,跟#define 有一样效果 当然了还有枚举类型,enum ,在常量和名字之间建立了联系,这样当你在运算的时候 可以是常量数值,输出给用户的数据可以是该常量的名字,为显示数据提供了方便. */
#include <stdio.h>
/* 1.1. tolower() 把大写字母转成小写字母*/
int tolower(int c)
{
    if(c>='A' && c<='Z')
       return c + 'a' - 'A'; //看下面的ASCII 对照表
    else 
       return c;   
}
/*方法2 */
int tolower_(int c)
{
    (c>='A' && c<='Z')?(c=c+'a'-'A'):(c=c); 
    //notice that the operators ?: precedence less than - + but higer than =
    // so wo need parentheses
    return c;
}
/* ASCII 对照表 二进制 十进制 十六进制 图形 二进制 十进制 十六进制 图形 0100 0001 65 41 A 0110 0001 97 61 a 0100 0010 66 42 B 0110 0010 98 62 b 0100 0011 67 43 C 0110 0011 99 63 c 0100 0100 68 44 D 0110 0100 100 64 d 0100 0101 69 45 E 0110 0101 101 65 e 0100 0110 70 46 F 0110 0110 102 66 f */

/* 1.2 .toupper()//同理可得到小写字母转大写字母*/
int toupper(int c)
{
  if(c>='a' && c<='z')
     return c + 'A' - 'a';
}
/* 1.3. strlen函数 返回 str的长度 */
int _strlen(char str[])
{
    int i=0; //在函数内部,如果变量比较少,就定义的简单一些,方便自己减少程序的size
    while(str[i++] != '\0'); // ;号代表 while循环,循环体是空的
    return i-1;//返回的是字符的个数,不包含 \0 
}
/*isdigit is judge the char is 0--9 or not */
int isdigit(int c)
{
    return c<='9' && c>='0';
}
/*power : 计算base的n次方*/
int power(int base,int n)
{
    int p ;
    for(p = 1; n > 0; n--)
       p = p*base;
    return p;   
}
/*ctoi char conver to int */

/*通过上面的例子,我们可以自己去看头文件里面的函数的具体实现 看看自己写的跟大师写的有何区别,如果能发现大师写的优点和自 写的缺点当然很好,不能发现,就记住大师的写法,然后继续学,当你 的只是足够丰富的时候,可能就会发现大师写法的优异,我觉得这本 书很好,的可以让我们自己有一种自己写头文件的赶紧,平常自己使用 的头文件的函数,这本书基本上都会出现,这就有利于我们学习c语言 并且使用头文件,这样我们在使用系统通过的库函数,跟有利于看库函 数源码,我是这样想的*/
/* 2. 运算符 2.1 一元运算符 - + 我们使用的++ -- 2.2 二元运算符 我们熟悉的 + - * / % 优先级是: (+ - 同级) < (* / % 同级) < (-- ++) 运算符遵循从坐到右的结合原则 */
/* 2-3 htoi 函数把16进制的字符串转成整数 这个方法是我自己写的但是看完答案之后,觉得太low */
int htoi(char str[])
{   
    int index = 0;
    int length = _strlen(str) - 1;
         printf("length: %d \n",length + 1 );
    int total,h;
    if(str[0] == '0' && str[1] == 'x' || str[1] == 'X') //前缀可选
       index =  2;
    int c;
    for(total = 0, h = 1; length >= index; length--,h=h*16)
    {
        c = tolower(str[length]);
        switch(c)         
        {
          case '0' :
          case '1' :
          case '2' :
          case '3' :
          case '4' :
          case '5' :
          case '6' :
          case '7' :
          case '8' :
          case '9' : total = total + (c-'0') * h; break;
          case 'a' : total = total + 10 * h; break;
          case 'b' : total = total + 11 * h; break;
          case 'c' : total = total + 12 * h; break;
          case 'd' : total = total + 13 * h; break; 
          case 'e' : total = total + 14 * h; break;
          case 'f' : total = total + 15 * h; break;
          default: return -1;
        }
    }
  return total;
}
/*htoi 函数把16进制的字符串转成整数 看完答案我这样写 */
int htoi_(char str[])
{   
    int index = 0;
    int total = 0;
    if(str[0] == '0' && str[1] == 'x' || str[1] == 'X') //前缀可选
       index =  2;
    int c;
    while(c = tolower(str[index++]))
    {
        if(c >= '0' && c <= '9')
           total = 16 * total + (c-'0');//递归的思想,每往下走一层就把原来的数据*16 
        else if(c >= 'a' && c <= 'f')     
           total = 16 * total + (c-'a'+10);
        else return -1;//输入数据错误 返回 
    }
  return total;
}
/* 测试hex转10进制的的代码 */
void test_htoi_()
{
  printf("%d \n",htoi_("12"));
  printf("%d \n",htoi_("0x12"));
  printf("%d \n",htoi_("0X12"));
  printf("%d \n",htoi_("1y2"));
  printf("%d \n",htoi_("fF"));
}
/* 2-4 squeeze function : delete each charaters in s1 that matches any charaters in the string s2 测试方法: char s[]="abcafdffssaf"; char s1[]="dbc"; squeeze(s,s1); squeeze("abc","bc");//采用这种方法测试的话,就会出现堆栈溢出的情况,具体原因我也不清除, */
void squeeze(char s1[], char s2[])
{

     printf("%s , %s \n",s1,s2);

     int i = 0;    
     int j = 0;    
     int index = 0;     
     while(s2[j]!='\0')
     {
        for(i = 0, index=0; s1[i] != '\0'; i++)
            if(s1[i] != s2[j])
               s1[index++]=s1[i];
        s1[index] = '\0';   
        j++;
     }


     printf("%s\n",s1);
}
/* any function: return the first location in the string s1 where any charater from the string s2 occurs ,or -1 if s1 contains no characters from s2 test : printf("locate : %d \n",any("adafdf","d")); */
int any(char s1[],char s2[])
{
    int locate = -1;
    int i = 0;    
    int j = 0;    
    while(s2[j]!='\0' && locate==-1)
    {
       for(i = 0; s1[i]!='\0' && locate==-1; i++)
           if(s1[i] == s2[j])
              locate = i;
    }
    return locate;
}
/* bit operation -128 的原码,补码都是 1000 0000,假如用补码1000 0000 来计算,原码是: 0000 0000 是不对的 所以,0x80 ,输出结果是-128 而不是0,计算机存储的就是补码 关于补码原码反码的更多介绍,可以看这里 http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 2-6 . setbits function : return x with the n bits that begin p set to the rightmost n bits of y,leaving the other bits unchanged */
unsigned char setbits(unsigned char x, int p, int n, int y)
{ 
    unsigned char x_left = x >> (p+1) << (p+1);
    int l = 8-1-p+n;
    printf("%d , %d \n",l,x<<l);
    //unsigned char x_right = (x << (8-p-1+n)) >> (8-p-1+n); 
    unsigned char x_right = (x << (8-p-1+n)) ; 
        x_right = (x_right >> (8-p-1+n)) ; 
    unsigned char x_button= x >> (p+1-n) ; 
    printf("%d \n",x_left);
    printf("%d \n",x_right);
    printf("%d \n",x_right|x_left);
    if(y == 1)
    {
       x_button |= ~(~0<<n);
       x_button <<= (p+1-n);
       x = x_button| x_left | x_right ;
    }
    else if(y == 0)
      x =  (x_right|x_left) ;

    printf("%d \n",x);
}
/* 2-7 invert function: that return x with n bits that begin at position p inverted (i.e., 1 changed into 0 vice versa),leaving the others unchanged */
unsigned char invert(unsigned char x, int p, int n)
{ 
    unsigned char x_left = x >> (p+1) << (p+1);
    int l = 8-1-p+n;
    // printf("%d , %d \n",l,x<<l);
    // unsigned char x_right = (x << (8-p-1+n)) >> (8-p-1+n); 
    unsigned char x_right = (x << (8-p-1+n)); 
    x_right = x_right>>(8-p-1+n); 
    unsigned char x_center= ~x>>(p+1-n); //inverted the x of all and move n bits to he rightmost end
    x_center &= ~(~0<<n); //set all characters to zero exclude the n bits 
    x_center <<= (p+1-n);//move the n bits to back postion

    printf("%d \n",x_left);
    printf("%d \n",x_right);
    printf("%d \n",x_center);

    x = x_center| x_left | x_right ;

    printf("%d \n",x);
}

/* 2-9. bitcount function : return the count the numner of the 1-bit in x */
int bitcount(unsigned s)
{
    int i = 0;
    while(s &= s-1)
        i++;
   return i+1;     
ub
/*主方法,方法的入口*/
main()
{
 printf("%d \n",bitcount(0xf));
 printf("%d \n",bitcount(0xff));
 printf("%d \n",bitcount(0x1f));
 printf("%c \n",tolower_('H'));
}

你可能感兴趣的:(C语言,位操作,运算符优先级,逻辑操作符,运算操作符)