【学习ios之路:C语言】进制.位运算.栈

1.进制转换

1).10进制转为N进制.方法:(连除倒取余).

2).N进制转换为10进制.方法:(按权求和法):当前位上的数乘以基数的位数减1次方.

例:

0b1111 ---- 1* 2^3 + 1*2^2 +1 * 2^1 +1*2^0 = 15;

038 ----- 3*16^1 +8*16^0 = 56;

3).N进制转换N进制.

例如: 二进制 --- 16进制

      1010   0011  ----  A 3  

       1111   0011  ----  F 3 

    
   
    int a = 010;//8进制
    int b = 0x10;//16进制
    printf("%d\n", a);
    printf("%d\n", b);
    
    /**
     如何输出进制数:
      %d  ------  十进制
      %0x ------ 十六进制
      %o  ----  八进制
     */
    

 2.位运算符


    
    
    //按位与    &
    int a = 5 & 7;//5 101 7 111 同为1,则为1.否则为0  .,常用来给某一位做清零操作.
    printf("%d\n", a);//101
    
    //按位或    |
    int b = 5 | 7;// 101 111 同为0,则为0,否则为1.,,常用来保留某一位状态.
    printf("%d\n", b);//111 
    
    //按位异或  ^
    int c = 5 ^ 7;
    printf("%d\n",c);//101  111  010 ,相同为0,不同为1
    
    //按位非    ~
    char d =  ~ 7;//每一位都做取反操作.
    printf("%d\n", d); //7 111  -1000 -8
    
    
    //负数补码运算: 绝对值取反 加1  符号位 1 相当于 -  0 相当于 +
    //如果是一个有符号的数,则二进制最高位代表符号位,1 代表负数,0代表正数.
    //数据在内存中存储时是以补码的形式存储,正数的补码是正数本身,负数的补码是绝对值取反加一.
    //一个字节代表八位二进制数.
    /**
     *  数据类型的取值范围:
     *  无符号:
     *  char 0 ~ 2^8 - 1  //0 - 255
     *  short 0 ~ 2^16 -1
     *  int 0 ~ 2^32 - 1
     *  有符号:
     *  char 11111111有符号,最高位是符号位, - 2^7 ~2^7 - 1  -128 - 127(正数包括0,即128)
     *  short - 2^15 ~ 2^15 - 1
     *  int - 2^31 ~ 2^31 - 1
     */
    
    char f = 255;//11111111 绝对值01111111 取反 100000000 加1 100000001 即 -1,负数是按照补码存储的
    printf("%d\n", f);//-1
   
    unsigned char e = 255;
    printf("%d\n",e);//超出范围溢出,即为0

    //左移     <<
    unsigned char g = 1;
    printf("%d\n",g << 3);//乘以2的3次方  // 8
    //右移     >>
    printf("%d\n",255 >> 2);//除于2的2次方  //63


例题:

1.将100高四位与第四位互换.100: 0110 0100

 
   
    unsigned char number = 0b01100100;
    
    //1.左移动四位
    unsigned char left = number << 4;//01000000
   
    //2.右移动四位
    unsigned char right = number >> 4;//00000110
    //3.按位或
    
    unsigned char result = left | right;//01000110
    printf("%d\n", result);//70


2.将10010010 奇偶位互换

    
    unsigned char num = 0b10010010;//146
    //1.向左移动一位,得到奇数位
    unsigned char left1 = num << 1; //00100100 ,因为是char型,当向左移动,值=146*2溢出.但换位int型就ok了.char类型范围,-128 - 127    printf("左移:num = %d,left1 = %d\n", num, left1);
   
    //2.保留偶数为,将奇数位清零.  00100000
    unsigned char l = left1 & 0b10101010;//奇数位清0,即奇数位为0.&同为1即为1
    
     //3.向右移动一位得到
     unsigned char right1 = num >> 1;//01001001
     //printf("右移:num = %d,right1 = %d\n", num, right1);
     
    //4.保留奇数位,讲偶数位清零. 01000001
     unsigned char r = right1 & 0b01010101;
    
    //5.按位或
    unsigned char s = r | l;
    printf("%d\n", s);
    

 

2.两个数交换,不使用第三个变量(企业级做法)

    
    int m = 10, n = 5;
    m = m ^ n;
    n = m ^ n;
    m = m ^ n;
    printf("%d %d\n", m, n);
    

4.栈内存分配原则

   
    
     <span style="color:#000000;">/**
     * 栈区内存分配原则
     * 原则: 从高到低分配,从低到高存取.
     * 地址: 内存单元的一个编号
     */
    //数组名代表数组的首地址,也就是数组中第一个元素的地址.是一个常量地址.
    int m1[5] = {1, 2, 3, 4, 5};
    printf("%p\n", m1);    //0x7fff5fbff7f0结果
    printf("%p\n", &m1[0]);//0x7fff5fbff7f0
    printf("%p\n", &m1[1]);//0x7fff5fbff7f4
    printf("%p\n", &m1[2]);//0x7fff5fbff7f8
    printf("%p\n", &m1[3]);//0x7fff5fbff7fc
    printf("%p\n", &m1[4]);//0x7fff5fbff800 //存取,从高到低存取
    printf("-------------------------\n");
    
    int x = 5;
    int y = 10;
    printf("%p\n",&x);//0x7fff5fbff7b8
    printf("%p\n",&y);//0x7fff5fbff7b4,可看出从高到底分配空间
    
    
    int s1 = - 5;// 1000  0000 0000 0000 0000 0000 0000 0101 按照补码存储,绝对值取反加一
    printf("%d\n", s1);//1111 1111 1111 1111 1111 1111 1111 1011 FF FF FF FB //断点


 </span>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。