码迷,mamicode.com
首页 > 其他好文 > 详细

<13>【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

时间:2015-07-06 15:54:30      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

 

 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     
 5     //定义10进制数,打印出10、8、16进制的值
 6     int a = 13;
 7     printf("%d\n",a);
 8     printf("%o\n",a);
 9     printf("%x\n",a);
10     
11     //int 64 4个字节
12     int b = 0b00000000000000000000000000001101;
13     printf("%d\n",b);
14     
15     //015是一个8进制数
16     int b1 = 015;
17     printf("%d\n",b1);
18     
19     //定义一个16进制的数,打印其10进制值
20     int b3 = 0x520A;
21     printf("%d\n",b3);
22     
23     return 0;
24 }
13
15
d
13
13
21002

-------------------------------

【理解】原码反码补码基本概念

 

   原码:
 
       一个数绝对值的二进制表示,如果是+  最高位(最最侧的位) 改0 
                                  -  最高位(最最侧的位) 改1
 
   反码:
 
       正:正数的反码等于原码
 
       负:除符号位不变,其他位逐位取反(1->0,0->1)
 
   补码:
 
       正:正数的补码等于原码
 
       负:
            1)反码+1
            2)在原码基础上符号位不变,其他各位取反,最后再+1
 
      注意:
 
        一个整数的原码、反码、补码都一样
 
 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     
 5     
 6     //64为机器下
 7     // int 类型占用 4个字节 ,每个字节8为
 8     // 计算机存储1使用32位的二进制数码,存储的事补码
 9     
10     // +1 存储的事补码
11     // 原码:000000000000000000000000000000001
12     // 反码 == 原码
13     // 补码 == 原码
14     
15     int b1 =0b000000000000000000000000000000001;
16     printf("b1 = %d\n",b1);
17     
18     // -1 存储的是补码
19     // 原码:100000000000000000000000000000001
20     // 反码:111111111111111111111111111111110
21     //     +000000000000000000000000000000001
22     //    --------------------------------------
23     // 补码:111111111111111111111111111111111       -1
24     
25     int b2 = 0b111111111111111111111111111111111;
26     printf("b2 = %d\n",b2);
27 
28     return 0;
29 }
b1 = 1
b2 = -1

-----------------------------------------------------

【理解】为什么要引入反码、补码?

   电路更简单

---------------------------

【掌握】位运算符介绍及使用

 

   运算符:
  
        运算符用来连接操作数,组成有意义的式子
 
   分类:
 
       算术   关系   逻辑   位运算
 
   位运算:
 
        用于整数的二进制位之间的运算
 
        &  按位与:如果两个位进行&操作,同1则结果为1,有0结果就为0
 
         9 & 8
 
         00000000000000000000000000001001
        &00000000000000000000000000001000
 ------------------------------------------
         00000000000000000000000000001000
 
        |  按位或:如果两个位进行|操作,有1则结果为1,同0结果就为0
         
          00000000000000000000000000001001
         &00000000000000000000000000001000
         ------------------------------------------
          00000000000000000000000000001001         9
 
 
        ~  按位取反:1变0 ,0变1
           ~9;
              00000000000000000000000000001001
             ~
            -----------------------------------
              11111111111111111111111111110110   补
 
              补码-->原   :符号位不变,取反+1
 
              1000000000000000000000000000100110000000000000000000000000001010   原 -10
 
        ^  按位异或:相同为0,不同为1
 
           9^8
               00000000000000000000000000001001
             & 00000000000000000000000000001000
             ------------------------------------------
               00000000000000000000000000000001
 
 

 
 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     //进行按位与运算
 5     int result = 9 & 8;
 6     //按位或
 7     result = 9|8;
 8     //按位取反
 9     result = ~9;
10     //9异或8
11     result = 9^8;
12     
13     printf("result = %d\n",result);
14     return 0;
15 }
result = 1
 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     
 5     /*
 6      
 7      >> 右移位
 8         8>>2  == 2
 9      
10         一个数右移n位,值等于 原值 除以 2^n,结果是整数部分
11      
12      右移位,移出去的部分要舍弃
13      高位要补符号位
14           000000000000000000000000000010
15                                        |
16      
17      右移位,不会改变一个数的正负性
18      
19      
20      
21      << 左移位
22      
23         左侧、高位移动出去的位就丢了
24         低位开始补0
25      
26         8<<2   == 32
27         记忆的技巧:向左移动n位,相当于原数*2^n
28      
29                     00000000000000000000000000100000
30                     |
31      
32         致命问题
33                     -1073741823
34                     11000000000000000000000000000001;
35                     |
36                     00000000000000000000000000000100;
37      
38         注意:左移可能会改变一个数的正负性
39      
40      */
41     //进行左移运算
42     int result = 8<<2;
43     int b = 0b11000000000000000000000000000001;
44     result = -1073741823 << 2;
45     
46     //进行右移位操作
47     //       8/4
48     result = 9>>2;
49     
50     
51     printf("b = %d\n",b);
52     
53     
54     int c = 6;
55     //实用技能:
56     //1)获取一个数的最低位  让这个数和1进行按位&操作
57     //...... 00000110
58     //...... 00000001
59     
60     //2)向把第30位设置一个0
61     //...... 00000101   4
62     //...... 11111011 
63     
64     result = c&1;
65     printf("result = %d\n",result);
66     return 0;
67 }

位运算应用:编程实现10进制转2进制

#include <stdio.h>

/**
 *  传递整数n 然后把n转换成二进制,然后输出
 *
 *  @param n
 */
void changeTo2(int n){

    //计算数的位数
    int len = sizeof(n) * 8;
    //n = 13
    /*
     00000000 00000000 00000000 00001101
                                       |
     00000000 00000000 00000000 00000001
     
     
     //1011000000000000000000000000000000
     //00            ..........         1
     
     */
    int temp;

    for (int i=0; i<len; i++) {
        temp = n;  //每次循环13
        temp = temp>>31-i;   //13>>0   13>>1  13>>2
        //1、让n 右移i
        //2、用n移动i位之后的结果和1进行按位与
        int t = temp & 1;
        printf("%d",t);
        //3、打印与的结果
        
    }

    printf("\n");

}

int main(int argc, const char * argv[]) {
    
    changeTo2(13);
    
    return 0;
}

 

应用:实现两个变量值交换

#include <stdio.h>

void jiou(int n){


    //n和1进行按位与
    if (n&1) {
        printf("奇数\n");
    }else{
        printf("偶数\n");
    }
     // 1   奇数
     // 0   偶数

}

int main(int argc, const char * argv[]) {
    
//    jiou(6);
    
    int a = 3,b=4;
    //a = 4,b = 3;
    printf("a = %d,b = %d\n",a,b);
    //交换变量之前
//    int temp;  //临时变量
//    //3    3
//    temp = a;
//    //4    4
//    a = b;
//    //3    3
//    b = temp;‘
    
    a = a^b;
    b = a^b;
    a = a^b;
    
    /*
     0011   3
     0100
  ^
     -----
     0111     a  =  7     b=4
     
     
     0111
     0100
  ^
     -----
     0011     b = 3, a = 7
     
     
     a = a^b;
     
     0111
     0011
     
  ^
    ------
     0100     a = 4
     
     
     
     
     
     */
    
    printf("a = %d,b = %d\n",a,b);
    
    return 0;
}

【掌握】变量地址获取及存储原理

 

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    //定义两个变量,都是int类型的
    //高                                低
    //00000000 00000000 00000000 00000011
    int a = 3;   //4
    //高                                低
    //00000000 00000000 00000000 00000100
    
    int b = 4;   //4
    char ch = a;
    
    //输出一个地址,%p
    printf("&a = %p\n",&a);
    printf("&b = %p\n",&b);
    printf("&ch = %p\n",&ch);
    
    //a的地址大,还是b的地址大?
    //注意:a的地址大,b的地址小,为什么?
    //计算机分配内存的时候:从高地址向地址分配,先定义的变量,分配的是高地址,
    //                                   后定义的变量,分配得时低地址
    //a的地址和b的地址一定连续吗?不一定是连续的
    
    //2、变量的存储细节:
    //低字节 存放在低地址  高字节存在高地址
    
    //3、变量的地址:变量的首地址(变量在内存中占用的存储单元中地址最小的那个地址)
    
    return 0;
}
&a =  0x7fff5fbff6ec
&b =  0x7fff5fbff6e8
&ch=  0x7fff5fbff6e7                //char 是四字节,最后定义所以地址也是最低的

 

<13>【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

标签:

原文地址:http://www.cnblogs.com/kongweiiwei/p/4624466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!