记一次负数的二进制

Posted mabeytang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次负数的二进制相关的知识,希望对你有一定的参考价值。

这是去年的一个填空题,当然,只要知道换算二进制就完全没问题的~

  1 #include<iostream>
  2 #include<cstdio>
  3 using namespace std;
  4 
  5 void to2(int x)
  6 {
  7     int flage = 0;
  8     flage = (x>0)?1:-1;
  9     if(x == 0) flage = 0; 
 10     switch(flage)
 11     {
 12         case 0:cout<<"        ";break;
 13         case 1:{    // 正数二进制 
 14             int s[8] = {0}, e = 7;
 15             while(x!=0)
 16             {
 17                 s[e] = x%2;
 18                 x /= 2;
 19                 e--;
 20             }
 21             for(int i=0;i<8;i++){
 22                 if(s[i] == 1) cout<<"*";
 23                 else cout<<" ";
 24             }
 25                 
 26             break;
 27         }
 28         case -1:{    // 负数二进制 
 29             x = -x;
 30             int s[8] = {0}, e = 7;
 31             while(x!=0)
 32             {
 33                 // 取反码然后取补码 
 34                 s[e] = ((x%2) == 1)?0:1;
 35                 x /= 2;
 36                 e--;
 37             }
 38             // 补码
 39             int t = 1;
 40             for(int i=7;i>=0;i--){
 41                 if(s[i] + t == 2){
 42                     s[i] = 0;
 43                     t = 1;    //进位了 
 44                 }
 45                 else{
 46                     s[i] = s[i] + 1;
 47                     t = 0;    //不进位 
 48                 }
 49             }
 50             for(int i=0;i<8;i++){
 51                 if(s[i] == 1) cout<<"*";
 52                 else cout<<" "; 
 53             }
 54                 
 55             break;
 56         }
 57         defualt:break;
 58     }
 59 }
 60 
 61 void show(int a[][32])
 62 {
 63     for(int i=0;i<10;i++){
 64         for(int j=0;j<32;j++){
 65             to2(a[i][j]);
 66             if((j+1)%2 == 0)
 67                 cout<<endl;
 68         }
 69         cout<<"-------------------"<<endl;
 70     }
 71 }
 72 
 73 int main()
 74 {
 75     FILE *fp;
 76     int a[10][32] = {0};
 77     fp = fopen("test.txt", "r+");
 78     if(fp == NULL){
 79         // printf("NULL
");
 80         return 0;
 81     }
 82     while(!feof(fp))
 83     {
 84         for(int i=0;i<10;i++)
 85             for(int j=0;j<32;j++){
 86                 fscanf(fp, "%d", &a[i][j]);
 87             }
 88     }
 89     fclose(fp);
 90     /*
 91     for(int i=0;i<10;i++){
 92         for(int j=0;j<32;j++){
 93             cout<<a[i][j]<<" ";
 94         }
 95         cout<<endl;
 96     }
 97     */
 98     
 99     /*转换成8位二进制*/
100     
101     show(a);
102     // 九的九次方等于多少...... 
103     getchar();
104     return 0;
105 }

下面是数据:


 1 4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
 2 16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16 
 3 4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
 4 0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4 
 5 4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64 
 6 16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128 
 7 0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0 
 8 2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0
 9 1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0
10 0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0 

 技术图片

技术图片

技术图片

技术图片

技术图片

以上是关于记一次负数的二进制的主要内容,如果未能解决你的问题,请参考以下文章

记一次生产环境线程阻塞的排查

记一次文件转码与二进制查看学习

java并发-记一次统计变量值偏差问题

java并发-记一次统计变量值偏差问题

深入认识二进制序列化--记一次生产事故的思考

记一次mysql小版本升级