admin管理员组

文章数量:821247

进制转换与逻辑词

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

/*
* 1.2048控制台
* 2.带图形界面
* 3.微信小程序
* 4.App(安卓,苹果)
*/
/*
* 专题讲解:
*   1.进制转换
*     人: 十进制,0~9,123.4 = 1*10^2+2*10^1+3*10^0+4*10^-1(二进制转整数换十进制乘法,十进制转化除法)1111 1111=255=2^7(128)+2^6(64)+2^5(32)+2^4(16)+2^3(8)+2^2(4)+2
*     机器:二进制(通电,断电),0~1,1010.1 = 2^3+2^1+2^-1=10.5
*             (1表示有,0表示没有)
*      练习: 11101.1(二进制) = 2^4+2^3+2^2+2^0+2^-1=29.5
*               11111111(二进制) = 128+64+32+16+8+4+2+1=255
*       01011010110001101111011110111111(二进制)=算不了
*      十六进制:0~9,a~f/A~F.  0x12=1*16^1+2*16^0 = 18
*      0101 1010 1100 0110 1111 0111 1011 1111
*         5       a      C       6       f          7    B        F
*     二进制转十六进制:4合1
*     十六进制转二进制:1拆成4
*     两个十六进制数字对应1字节
*      01011010 11000110 11110111 10111111
*    八进制0~7:历史遗留问题,  0开头,例如 0123=1*8^2+2*8+3*8^0=83
*    十进制转二进制:凑,128 64 32 16   8 4 2 1
*        60->二进制 111100
*        100->二进制 1100100
*         80->二进制  1010000
*     0x或0X开头表示十六进制数字,0开头表示八进制数字,0b或0B开头表示二进制数字(新标准)
*    原码,反码,补码
*     正数三码合一.例如10->0000 0000 0000 0000 0000 0000 0000 1010
*      假设下面的数字占1字节(实际为4字节)
*      10 :0000 1010
*     -10:1000 1010 (原码) ,人好理解,但计算机不能使用
*       0  :1001 0100 (不是0,0000 0000)
*  设计原理
*        0: 0000 0000
*     10:0000 1010
*   -10: 1111 0110 (补码)
*        1 0000 0000 (一个字节只能保留8位二进制数字,最高位的1溢出丢弃)
*  做题: 1.正数三码合一,直接拆开
*           2.负数,写成绝对值的二进制,然后取反(全部取反),再加1
*      10:0000 1010
*     -10:0000 1010->取反 1111 0101 ->加一, 1111 0110
*     练习: -12:0000 1100->1111 0011-> 1111 0100
*               -1:0000 0001->1111 1110->1111 1111 (-1的二进制全1)
*      标准规定有符号数最高位表示符号,0为正,1为负
*      给定一个有符号数的二进制,最高位(符号位)如果为0,则为正数,后面的值相加即可
*      如果符号位为1,则为负数,其绝对值为取反+1
         例如 1111 1101->- 1111 1100-> -0000 0011->-3
                 1111 1111->- 0000 0000-> -0000 0001->-1
                 1111 1101->- 0000 0010->-0000 0011->-3
        练习:假设数字占一字节,下面都是有符号数
        34:0010 0010
        -3:1111 1101
        0b1111 0101:-0000 1010->-0000 1011->-11
        0b0111 0001:113
        无符号:所有的位都是数值,没有符号位
* 2.位运算(都是针对二进制),假设下面的数字占1字节
*       12: 0000 1100
*       13: 0000 1101
*     ~12: 1111 0011 按位取反(1->0,0->1)
*     ~13: 1111 0010
* 12&13: 0000 1100 按位与(相同的位都为1才为1)
* 12 | 13: 0000 1101 按位或(相同的位只要有一个1就为1)
* 12^13: 0000 0001 按位异或(相同的位不一样才为1),注意合数学区分
* 12<<1: 000 11000 按位左移(右边补0),注意合数学区分
*              24=12*2  (正数左移相当于乘以2的n次方) 
* 12<<2: 00 110000   48=12*4
* 12>>1:00000 110  按位右移(左边补符号位,如果无符号则补0)
*                   6=12/2  (正数右移相当于除法)
* -1>>1: -1

2.类型转换
*  如果数据不在合理的范围,需要写二进制,然后重新计算值
*/

int main()
{
    //char a = 200;//1100 1000->-0011 0111->-0011 1000->-56
    //printf("%d\n",a);//-56

    printf("%d\n",-1>>1);//-1??  

    return 0;
}
//int main()
//{
//    //如果数据不在合理的范围,需要写二进制,然后重新计算值
//    char a = 255;//-128~127, 255->0b1111 1111->- 0b1111 1110->-0b0000 0001->-1
//    unsigned char b = -1;//0~255->0b1111 1111->255
//    printf("%d,%d\n",a,b);//-1,255
//
//    return 0;
//}
//int main()
//{
//    char a = -1;//0xff->0b1111 1111
//    short b = -1;//0xffff->0b1111 1111 1111 1111
//    int c = -1;//0xffffffff->0b1111 1111 1111 1111 1111 1111 1111 1111
//
//    return 0;
//}

//int main()
//{
//    int a = 10;
//    a = 0x10;//16   
//    a = 012;//10
//    a = 0B1010;//新标准增加的  10
//    printf("%d\n",a);
//
//    return 0;
//}

本文标签: 进制转换与逻辑词