******************** 进制和位运算 ********************

 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



 数位: 从右往左,从零开始

 

 

 基数: 每个数位上可以使用数码的个数(2 进制数字的基数为2

 十进制为10)

 

 

 位权: 某个数位上得数字的实际大小

 

 

 1.********************  二进制转十进制  ********************

 

 

 0b1100 = 0 * 20次方 + 0 * 21次方 + 1 * 22次方 + 1 * 23次方

        =0 + 0 + 4 + 8

        =12

 

 0b1111 = 1 + 2 + 4 + 8

        =15

 

 0b1010 = 0 + 2 + 0 + 8

        =10

 

 2. 十进制转二进制

 

 67 = 64 + 2 + 1

    =26次方 + 21次方 + 20次方

    =0b1000000 + 0b10 + 0b1

    =0b1000011

 

 

 10 -> 2 / 8 / 16 除以2 / 8 /16 倒取余数法(小数部分乘以2取整)

 

 

 2 / 8 / 16 -> 10  按权展开

 

 123 = 100 + 20 + 3

       1*10^2 +2*10^1+3*10^0

 数码 * 基数^数位

 

 主要掌握  : 10  2  16进制的转换

 

 

 ********************  n位二进制的取值范围  ********************

 

 

 2位二进制的取值范围: 0~3 0~22次方-1

 3位二进制的取值范围: 0~7 0~23次方-1

 n位二进制的取值范围: 0~2n次方-1

 

 1位为正负位 

 

 char 的取值范围: -27次方~27次方-1

 int 的取值范围: -231次方~231次方-1

 

 

 ********************   机器数与真值   ********************

 

 

 1 机器数是带有符号的

 2 机器数就是在计算机中得二进制形式

 3 真值是指机器数表示的实际数字

 

 一个数字,如果需要搞清楚在计算机中如何表示,

 只要将其转换为二进制即可;

 

 

 要求计算机可以用二进制数表示负数

 

 数字一定要可以比大小

 

 数字一定要可以计算加法

 全部为1的二进制数字可以表示 -1

 

 二进制全部为1即可以是整数也可以是负数,认为规定从左往右第一个

 二进制为表示符号位,0表示正数,1为表示负数

 

 

 认为规定数字的正数表示的二进制是计算机中得二进制一致的

 而负数的二进制的表示方法利用正数的数据为一位取反后加一来表示

 

 正数: 原码 = 反码 = 补码(都一样)

 

负数:  

        1 将原码的符号位改为1即负号

        2 反码 符号位后边的原码取反

        3 补码 反码 + 1

 

 步骤1: 1000 0000 0000 0000 0000 0000 0000 1010

 步骤2: 1111 1111 1111 1111 1111 1111 1111 0101

 步骤3: 1111 1111 1111 1111 1111 1111 1111 0101 + 1 

     =  1111 1111 1111 1111 1111 1111 1111 0110

 

 

 ********************   位运算   ********************

 

 

 

 按位与(&) (11) 2 & 3 = 10 & 11 = 10 = 2

 

 按位或(|) (00) 1 | 2 = 01 | 10 = 11 =3

 

 按位反 ~1 = 0

 

 按位异或

 1 ^ 1 = 0

 1 ^ 0 = 1

 0 ^ 1 = 1

 0 ^ 0 = 0

 

 左移 <<

 每一位向左移动,超出忽略,不够补零(正负编译器决定)

 左移n 相当于乘以2n次方

 

 

 右移>>

 补符号位

 无符号的类型(非负数)右移补零

 

 

 

 

 

 char  1个字节  8个二进制位

 只有7位表示数字

 每一位可以表示01,那么就由2^7中数字可以表示,128个数字

 负数即为: -1~-128

 :0

 正数:1~ 127

 

 

 

 ********************   类型说明符   ********************

 

 

 unsigned(无符号,无符号位)  %u 表示无符号     signed(有符号)

 

 signed int  == signed    二进制的取值范围 -231次方到231次方-1

 

 unsigned int == unsigned    二进制的取值范围   0232次方-1

 

 

 

 signed表示有符号的,平时定义变量 int num;

 默认实际为 signed int num;

 

 

 unsigned 就是表示一个无符号的数据,取值范围增大,

 那么所以字节数就都表示的是数字

 

 (unsigned) // c1 = 1<<7; // (128) //-128

 

 (类型说明符,只能修饰int) : short long  long long == long long int  8个字节 (%lld)

 short == short int  2个字节  %d

 long == long int 8个字节   %ld

 

 long unsigned int c  ==  long unsigned c    %lu

 short unsigned int c == short unsigned c    %u

 

 

 int s = sizeof(long long int)(long long int 的字节数)

 

 

 

 ********************  交换变量  ********************

 

  a= a+b

  b= a-b

  a= a-b

 

  a= a*b

  b= a/b

  a= a/b

 

 

 */


//********************  编程实现打印出数字的二进制数内容  ********************


/* 

 

    %d/%i 十进制形式输出正式

    %c 输出字符

    %p 输出地址

    %f 输出小数

    %o 打印8进制数

    %x 打印16进制数

     

 int main()

 {

 // 默认情况下,就是十进制

 int number = 12;

 

 // 二进制(0b或者0B开头)

 int number2 = 0B1100;

 

 // 八进制(0开头)

 int number3 = 014;

 

 // 十六进制(0x或者0X开头)

 int number4 = 0xc;

 

 // %d10进制整数的形式输出一个数值


 //%x打印16进制数

 printf("%x\n", number);

 

 return 0;

 }

 */


#include <stdio.h>


int main()

{

    void putBinary(int);

    

    //putBinary(-13);

    

    putBinary(13);

    

    return 0;

}


// 输出一个整数的二进制存储形式

void putBinary(int n)

{

    int bits = sizeof(n) * 8;

    

    while (bits-- > 0) {

        printf("%d", n>>bits&1);

        if (bits%4==0) printf(" ");

    }

    printf("\n");

}



// 小写字母转为大写


char upper(char c){

    //如果是小写字母,就转成大写

    if(c >= 'a' && c <= 'z'){

        return c - ('a' - 'A')//32;

    }else{

    //如果不是小写字母,就返回字母本身

        return c;

    }

}


#include <stdio.h>


int main(int argc, const char * argv[]) {

    

    char cc = upper('f');

    printf("%c\n",cc);

    return 0;

}



/*

 使用位异或运算符交换两个变两得值

 

 */

#include <stdio.h>




int main(int argc, const char * argv[]) {

   

    int a = 10;

    int b = 11;

    // a ^ b ^ a = b

    

    a = a ^ b;

    b = a ^ b;

    a = a ^ b;

    

    printf("Hello, World!\n");

    return 0;

}




//用位与&运算符判断变量的奇偶性


#include <stdio.h>


int main(int argc, const char * argv[]) {

    

    int a;

    scanf("%d",&a);

    if(a&1 == 1){

        printf("奇数\n");

    }else if(a&1 == 0){

        printf("偶数\n");

    }


    /*

     if (a%2) {

     printf("奇数\n");

     } else {

     printf("偶数\n");

     }*/


    return 0;

}



//  写一个函数,用来输出整数在内存中得二进制形式

//

//  Created by 李佳乐 on 15-3-12.

//  Copyright (c) 2015 gongsimingzi. All rights reserved.

//

/*


#include <stdio.h>


void printEr(int num){

    

    int value;

    int temp = (sizeof(num)<<3)-1;

    for(int i = temp ;i >= 0;i--){

        value = (num>>i)&1;

        printf("%d",value);

        

      


    }

    printf("\n");

    

    }



int main(int argc, const char * argv[]) {

   

    

    printEr( 9 );

    

   

    return 0;

}

 

 */



#include <stdio.h>



void printEr(int num);


int main()

{

    

   printEr(9);

    

    return 0;

}



void printEr(int num){

    

    int temp = (sizeof(num)<<3)-1;

    

    while(temp >= 0){

        //先挪位,&1,取出对应的值

        int value = num>>temp&1;

        

        printf("%d",value);

        temp--;

        //每输出4,就输出一个空格

        if((temp + 1)%4 == 0){

            printf(" ");

        }

    }

    printf("\n");

}



//  显示数字的二进制数


#include <stdio.h>


int main(int argc, const char * argv[]) {

    int num = 2;

    unsigned int mark = (unsigned int)num;

    int temp;

    for (int i = 0; i < 32; i++) {

        temp = (mark & (1<<31))>>31;

        printf("%d",temp);

        mark<<=1;

    }

    printf("\n");

    return 0;

}




//  类型的取值范围


#include <stdio.h>


int main(int argc, const char * argv[]) {

    printf("char:%lu\n",sizeof(char));

    printf("int:%d\n",sizeof(int));

    printf("short:%d\n",sizeof(short));

     printf("long:%d\n",sizeof(long));

     printf("long long:%d\n",sizeof(long long));

    printf("Hello, World!\n");

    

    

    

    unsigned int num;

    num = (unsigned int)0 - 1;

    printf("%u\n",num);

    

    printf("有符号的最大值%d\n",num>>1);

    

    printf("有符号的最小值%d\n",num<<31);

    

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值