C语言基础--进制

时间:2023-03-08 20:32:42

进制表示:

//     1.默认就是10进制
int num = ;
// 2.在前面加上一个0就代表八进制
int num1 = ;
// %d是以十进制的方式输出一个整数
printf("%d\n", num1);
// %o是以八进制的方式输出一个整数
printf("%o\n", num);
// 在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
// 在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
// %x是以十六进制的方式输出一个整数
printf("%x\n", 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 = ;
printBinay(num);
return ;
} void printBinay(int value)
{
// 1.定义变量需要向右移动的位数
int offset = ;
// 2.通过循环取出每一位
while (offset >=) {
int result = (value >> offset) & ;
printf("%i", result);
// 3.每次取出一位就让控制右移的变量-1
offset--;
if ((offset+) % == ) {
printf(" ");
}
}
printf("\n");
}