C语言基础--进制

进制表示:

//     1.默认就是10进制
    int num = 12;
//    2.在前面加上一个0就代表八进制
    int num1 = 014;
//    %d是以十进制的方式输出一个整数
    printf("%d
", num1);
//    %o是以八进制的方式输出一个整数
    printf("%o
", num);
//    在数值前面加上0b就代表二进制
    int num2 = 0b1100;
    printf("%d
", num2);
//    在数值前面加上0x就代表十六进制
    int num3 = 0xc;
    printf("%d
", num3);
//     %x是以十六进制的方式输出一个整数
    printf("%x
", num); 

进制转换:

  二进制 --> 十进制

    1  2  4  8  …

  二进制  --> 八进制

    三位二进制表示一位八进制

  二进制  --> 十六进制

    四位二进制表示一位十六进制

原码 反码 补码:

/*
     12的二进制
     12在内存中存储的是它的补码
     00000000  00000000 00000000 00001100
     正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码    
     -12
     二进制的最高位我们称之为符号位 
     如果符号位是0代表是一个正数,
     如果符号位是1代表是一个负数    
     10000000  00000000 00000000 00001100 (-12的原码)
     11111111  11111111 11111111 11110011(反码, 符号位不变其它位取反)
     11111111  11111111 11111111 11110011
    +00000000  00000000 00000000 00000001
     _____________________________________________
     11111111  11111111 11111111 11110100(补码 , 反码+1)     

     结论:无论正数负数在内存中存储的都是补码        

     11111111  11111111 11111111 11110101 (补码)
    -00000000  00000000 00000000 00000001  (-1)
     _____________________________________________
     11111111  11111111 11111111 11110100 (反码)
     10000000  00000000 00000000 00001011 (原码)    
     */ 

位运算规律:

  & 按位与

       特点:只有对应的两位都是1才返回1 否则返回0

       规律:任何数按位与上1结果还是那个数

  | 按位或

       特点:只要对应的两位其中一位是1就返回1

       口诀:一真则真

  ^ 按位异或

       特点:对应的两位不相同返回1 相同返回0

       多个整数按位异或的结果和顺序无关

       int result2 = 9 ^ 5 ^ 6;

       int result2 = 9 ^ 6 ^ 5;

       相同整数按位异或结果是0

       int result3 = 9 ^ 9;

       任何整数按位异或上0结果不变

       int result4 = 9 ^ 0 ;

       任何整数按位异或上另一个整数两次结果还是那个数

       int result5 = 9 ^ 9 ^ 5;

       int result6 = 9 ^ 5 ^ 9;

  ~ 按位取反

        特点: 0变1 1变0

  << 左移

          a << n 把整数a的二进制位往左边移n位

          移出的位砍掉,低位补0, 发现左移会把原有的数值变大

          左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高

          注意点:左移有可能改变数值的正负性

  >> 右移

       a >> n 把整数a的二进制位往右边移n位

       移出的位砍掉, 缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)

       右移的应用场景:当要计算某个数除以2的N次方的时候就用右移,效率最高

位运算练习:

#include <stdio.h>
void printBinay(int value); 

int main(int argc, const char * argv[]) {
    /*
     要求定义一个函数, 传入一个整数, 输出该整数的二进制
     %i %o %x    
     0000 0000 0000 0000 0000 0000 0000 1001
    &0000 0000 0000 0000 0000 0000 0000 0001     
     // 1.让9的二进制向右移31, 就可以获取到9得最高位的二进制, 然后让9的二进制的最高位和1相&, 那么就可以获得9的最高位
     // 2.让9的二进制向右移30, 就可以获得9二进制的第二位
     // 3.以此类推, 直到0位置    

     技巧:
     1.任何数与1相&都是那个数
     2.利用位移取出每一位
     */
    int num = 15;
    printBinay(num);
    return 0;
}

void printBinay(int value)
{
    // 1.定义变量需要向右移动的位数
    int offset = 31;
    // 2.通过循环取出每一位
    while (offset >=0) {
        int result  = (value >> offset) & 1;
        printf("%i", result);
        // 3.每次取出一位就让控制右移的变量-1
        offset--;
        if ((offset+1) % 4 == 0) {
            printf(" ");
        }
    }
    printf("
");
}


 

原文地址:https://www.cnblogs.com/dx-230/p/4756004.html