• c语言:进制和位运算


    一.进制
    十进制转n进制: 连除倒取余.

    以 10 为例,不同进制的表示方法:

         十进制: 10;

         二进制: 0b1010;

         八进制: 010;

         十六进制: 0x10;

         

         

        

       int a = 100;

       printf("%o",a);

        /*

         如何输出进制数:

         %d ------ 十进制

         %o  ------ 八进制

         %0x ----- 十六进制

         */

        /*

         位运算符:按位与 &, 按位或 |, 按位非 ~, 按位异或 ^, 左移 <<, 右移 >>

         按位与 & : 同1 为 1,否则为 0,经常用于对某一位清零.

         按位或 | : 同0 为 0,否则为1.经常用于保留某一位,

         按位非 ~ : 如果是一个有符号的数,则最高位代表符号位,1 代表负数, 0 代表正数,

                   数据在内存中存储时,是以补码的形式存储的,正数的补码是本身,负数的补码是 绝对值 取反 加 1 .

         按位异或 ^ : 相同为 0,不同为 1 ;

         */

        左移 << :

        unsigned char d = 1;

       printf("%d",d << 4);

        右移 >>

        unsigned char a = 255;

        printf("%d",a >> 1);

        unsigned char number = 0b01100100;

        unsigned char left = number << 4;

        unsigned char right = number >> 4;

        unsigned char result = left | right;

        printf("%d",result);

       /*

        //将 10010010 奇偶位互换

        unsigned char num = 0b10010010;

        //清零操作使用 按位&, 保留的位数为 1 ,清 0 数位为 0 ;

        //1.将奇数位变偶数位,左移一位

        unsigned char left = num << 1;

        //2.保留偶数位,奇数位清 0

        unsigned char clearJi = left & 10101010;

        //3.将偶数位变奇数位,右移一位

        unsigned char right = num >> 1;

        //4.保留奇数位偶数位清0

        unsigned char clearOu = right & 01010101;

        //5.最后按位或 |

        unsigned char result = clearJi | clearOu;

        printf("%d",result);

        

     */

        

        /*

         数据类型的取值范围: 

         无符号: char 类型  0 -- 255 (2 的8次方 - 1);

                short     0 -- 2的16次方 - 1;

                int       0 -- 2的32次方 - 1;

         有符号: char    -2 的 7次方 -- 2 的7次方 - 1;

                short   -2 的15次方 -- 2 的15次方 - 1;

                int     -2 的31次方 -- 2 的31次方 - 1;

         */

        char b = ~4;

        int a = 5 ^ 7;

        printf("%d",b);

        

      //栈区内存分配原则: 由高到低分配, 由低到高存取.

        int a = -5;

        printf("%p\n",&a);

        int b = 10;

        printf("%p\n",&b);

        

        //数组名代表数组的首地址,也就是数组的第一个元素地址,是一个常量地址

        int a[4] = {1, 2, 3, 4};

        printf("%d\n", &a[0]);

        printf("%p\n", &a[1]);

        printf("%p\n", &a[2]);

        printf("%p\n", &a[3]);

        printf("%p\n", &a);

        //交换两个数的值 不借助第三方变量

        int a = 20;//1001

        int b = 36;//0101

        printf("交换前 a = %d,b = %d\n",a, b);

        a = a ^ b;//1100

        b = b ^ a;//1001

        a = a ^ b;//0101

        printf("交换后 a = %d,b = %d\n",a, b);

  • 相关阅读:
    [转]jQuery知识总结
    sqlserver2008 函数1
    使用触发器生成流水号
    日期格式
    数据库正在使用,删除不了的问题
    continue 语句
    逻辑语句和函数
    ASP.NET中的随机密码生成
    相对路径
    “基类包括字段,但其类型与控件的类型不兼容”的解决方法
  • 原文地址:https://www.cnblogs.com/hanpengshuai/p/4671457.html
Copyright © 2020-2023  润新知