进制
-
进制是一种表示数的方式
- 有二进制、八进制、十进制、十六进制
-
注意点
1、%d、%i表示按十进制输出数据
2、%o表示以八进制输出数据
3、%x表示以十六进制输出数据 -
进制转换
-
二进制转十进制
- 规则: 系数 * 基数(索引次幂)
- 系数: 每一位对应的值就是系数
- 基数:
例如从二进制转换到十进制, 那么二就是基数
例如从八进制转换到十进制, 那么八就是基数 - 索引:从最低位以0开始, 依次递增
-
二进制转八进制
- 把三个二进制位看做一个八进制位即可001 100 --> 14
-
二进制转十六进制
- 把四个二进制位看做一个十六进制位即可1011 --> 11
-
十进制转二进制和八进制
- 二进制:除2取余的逆序
- 八进制:除8取余的逆序
-
* 12
* 2
* ---
* 6 0
* 2
* ---
* 3 0
* 2
* ---
* 1 1
* 2
* ---
* 0 1
*
* 12 --> 1100
* 十进制转换八进制
* 规则: 除8取余, 余数倒叙
*
* 24
* 8
* ---
* 3 0
* 8
* ---
* 0 3
*
* 24 --> 30
源码 反码 补码
-
计算机在存储整型数据的时候,占用了4个字节,1字节等于8bit,所以占用了32bit
-
正整数的源码、反码、补码都是它的二进制(三码合一)
-
负整数的源码是他的二进制,并且最高位变为1
-
负整数的反码是除了符号位以外的0变1,1变0
-
负整数的补码是它的反码+1
注意点
-
无论是正整数还是负整数, 存储在计算机中的都是补码
-
源码 -> 反码(0变1, 1变0) --> 补码(反码+1)
-
补码 -> 反码(补码-1) -> 源码(0变1, 1变0)
位运算符
- &按位与
- 一假则假
9 & 3 = ?
0000 0000 0000 0000 0000 0000 0000 1001 // 9的补码
& 0000 0000 0000 0000 0000 0000 0000 0011 // 3的补码
-----------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001 // 1
12 & 8
0000 0000 0000 0000 0000 0000 0000 1100
& 0000 0000 0000 0000 0000 0000 0000 1000
-----------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1000
- | 按位或
- 一真则真
9 | 3 = ?
0000 0000 0000 0000 0000 0000 0000 1001 // 9的补码
| 0000 0000 0000 0000 0000 0000 0000 0011 // 3的补码
-----------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1011
- ~按位取反
- 真变假, 假变真
~9 = ?
0000 0000 0000 0000 0000 0000 0000 1001 // 9的补码
~1111 1111 1111 1111 1111 1111 1111 0110 // 结果的补码
0000 0000 0000 0000 0000 0000 0000 0001
-------------------------------------------
1111 1111 1111 1111 1111 1111 1111 0101 // 结果补码的反码
1000 0000 0000 0000 0000 0000 0000 1010 // 结果的源码 -10
- ^按位异或
- 相同为0, 不同为1
9 ^ 3 = ?
0000 0000 0000 0000 0000 0000 0000 1001 // 9的补码
^0000 0000 0000 0000 0000 0000 0000 0011 // 3的补码
-------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010 // 10
一些规律和应用场景
- 任何两个相同的值异或结果都为0
- 任何一个数和0异或结果都为0
- 任何一个数异或另外一个数两次后,结果还是那个数(常被用于加密)
左移和右移
-
左移
移动规则: 从符号位开始整体移动, 多余的砍掉, 缺少的用零补
计算规律: 一个数左移几位就是 这个数乘以2的多少次幂
应用场景: 在企业开发中一旦想要某个数乘以2的多少次幂, 就要想到左移 -
右移
移动规则: 除符号位以外整体右移, 多出来的砍掉, 缺少的用符号位填充
计算规则: 一个数右移几位就是 这个数除以2的多少次幂36 / 2(1) = 18
36 / 2(2) = 9
应用场景: 在企业开发中一旦想要某个正数数除以2的多少次幂, 就要想到右移
案例
#include <stdio.h>
int main()
{
/*
* 需求: 交换两个变量的值
*
* int a = 10; int b = 20;
*/
int a = 10;
int b = 20;
printf("交换之前a = %i, b = %i\n", a, b);
// int temp = a;
// a = b;
// b = temp;
// printf("交换之后a = %i, b = %i\n", a, b);
// a = a + b; // a = 10 + 20; a = 30;
// b = a - b; // b = 30 - 20; b = 10;
// a = a - b; // a = 30 - 10; a = 20;
// printf("交换之后a = %i, b = %i\n", a, b);
// a = a ^ b;
// b = a ^ b; // b = a ^ (b ^ b); b = 10;
// a = a ^ b; // a = (a ^ a) ^ b ; a = 20;
b = a ^ b;
a = a ^ b; // a = a ^ a ^ b; a = b; a = 20;
b = a ^ b; // b = a ^ b ^ b; b = a; a = 10;
printf("交换之后a = %i, b = %i\n", a, b);
return 0;
}
网友评论