------------进制
是一种计数的方式,数值的表示形式
十进制、二进制、八进制、十六进制
二进制 0、1 逢二进一
书写形式:需要以0b或者0B开头,比如0b101
八进制 0、1、2、3、4、5、6、7 逢八进一
书写形式:在前面加个0,比如045
十六进制 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一
书写形式:在前面加个0x或者0X,比如0x45
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分 别表示10,11,12,13,14,15。字母不区分大小写。
计算机中一个字节代表8位的二进制 double sizeof(double)*8
----------------------转换
10 -> 2 : 除2取余法,把10进制数除以2,然后取得余数的序列,再倒序
整数部分采取”除2取余法”,小数部分采取“乘2取整法”,高位补0,将得到的余数倒序输出。
2 -> 10 : 1010 = 0*2^0+1*2^1+0*2^2+1*2^3
2 --> 16 : 4合1法, 整数部分从右向左 4位结合成一位,小数部分从左向右4位结合1位, 不足部分补0
16 --> 2: 1拆4法, 16进制的1位拆成二进
------------------数据的取值范围
char -2^7 -- 2^7 -1 -128 -- 127
int -2^31 -- 2^31 -1 -2147483648 -- 2147483647
数据的取值范围有什么用?
规定我们定义变量 赋值的时候 要在对应的取值范围以内
signed 表示是有符号的(默认的就是有符号数)
unsigned 表示是一个无符号的数 (正数的取值范围会扩大一倍)
signed和unsigned只能修饰整型变量
-------------变量修饰符
修饰符(int short long long long signed unsigned)
short 2字节 %hd
-2^15 -- 2^15 -1
int 4字节 %d %i
long 8字节 %ld
long long 8字节 %lld (主要是为了解决32位机器问题)
-----------------------原码,反码,补码
了解:数据在计算机内部是以补码的形式储存的
正数
三码合一:
负数
反码:
原码符号位不变,其余个位取反
补码:
原码符号位不变,其余各位取反+1,反码+1
--------------------位运算
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。
C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。
1)& 按位与 口诀: 同1为1,有0为0
只有对应的两个二进位均为1时,结果位才为1,否则为0
补充:
1)任何数和1进行&操作,得到这个数的最低位
2)想把任一变为位置0,让这个位置的数与0进行&
1100
& 0001
--------
0000
2) | 按位或 口诀:有1则1
只要对应的二个二进位有一个为1时,结果位就为1,否则为0
1101
| 0000
--------
1101
3) ^ 按位异或 口诀:同0非1 ---> 相同为0,不同为1
当对应的二进位相异(不相同)时,结果为1,否则为0
1100
^ 0000
------
1100
注: 一个数 ^ 按位异或 另一个数两次 得到的还是自己
a ^ b ^ b == a
4)~ 按位取反
各二进位进行取反(0变1,1变0)
以上都是在二进制进行运算
~1100 ----> 0011
1)<< 左移
1、各二进位全部左移n位,高位丢弃,低位补0
1)左移可能会改变一个数的正负性
2)左移1位相当于*2^n
举例:快速计算一个数乘以2的n次方
(8<<3 等同于8*2^3)
2)>> 右移
各二进位全部右移n位,保持符号位不变
x >> n
x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位
1、右移不会改变一个数的符号
2 右移 n 位就相当于/2^n
用途:快速计算一个数除以2的n次方 (8>>3 等同于8/2^3)
#实现判断2个数的奇偶性
方法一:
if(num % 2 == 0){
偶数
}else{
奇数
}
方法二:
a&1 --> 1 奇数
--> 0 偶数
2 ---> 0010
& 0001
-----------------
0000 //偶数
3 ---> 1111
& 0001
-----------------
0001 //奇数
#实现2个变量的交换
方法一:
int temp = num1;
num1 = num2;
num2 = temp;
方法二:
int a = 10,b = 20;
a = a^b;
b = a^b; ---> a^b^b --> a
a = a^b; ---> a^a^b --> b
方法三:
数学方法:
a = b - a;
b = b - a;
a = b + a;
#编程实现10进制转2进制
>>(31-i) 取出二进制数的每一位数 1100......1100
&1 任何一个数和1进行&(按位与)得到任何一个数的二进制的最后一位
void changeTo2(int num){ //12
int len = sizeof(int)*8; //二进制每个字节占8位 int 占 32位
定义一个变量 保存二进制的每一位
int temp = 0;
for (int i = 0; i<len; i++) {
temp = num;
每次移动的位数
temp = temp >> (31-i); //1 1 0
1101 ...... 0001
取出最后一位 使用& 同1为1,有0为0
temp = temp & 1; //1 1 0
逢4空格
if (0 == i%4) {
printf(" ");
}
printf("%d",temp); 110
}
printf("\n");
}
|
|