A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王元18611727076 中级黑马   /  2015-10-25 22:52  /  823 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

------------进制
是一种计数的方式,数值的表示形式
十进制、二进制、八进制、十六进制

二进制 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");

}


1 个回复

倒序浏览
好长补课=.=
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马