C/C++ 生成指定格式的32位数据

版权声明:本文为博主原创文章,转载必须注明出处!! https://blog.csdn.net/qq_34902522/article/details/86089375

概述

可能看到这个标题,大家还是比较疑惑,不是很明白想表达什么意思,不着急,接着往下看就知道了.


在这里插入图片描述

假定有这样一个需求:
0-7 位这8个bit 存储 整形变量count的值,那么整形变量count的取值范围可以是(0,255).
8-13位 这6个bit 存储 整形变量second的值,那么整形变量second的取值范围是(0,63).
14-19位 6个bit 存储 整形变量minute得值,取值范围同上.
20-31位 这个12个bit 存储整形变量hour的值,那么其取值范围是(0,4095).

同时现在我们是知道hour,minute,second,count这个四个变量的值的.

分析

我们来分析一下怎么做,我们可以这样,把这四个变量的值分别转化成二进制,然后用字符数组存起来,就获得了对应的4个二进制数组,然后再用memcpy函数,把这四个数组按顺序copy到一个新的数组里不就行了嘛.

说干就干

首先我们先写一个函数,专门用来进行整数型->二进制数组的转换.这里可以有多种算法,大家可自行选择实现.

char* getBinaryArray(unsigned long value,int length){
    int len = length;
    int index = len - 1;
    char *binary = (char*)malloc(sizeof(char)*len);
    memset(binary,'0',sizeof(char)*len);
    int r_value;
    r_value = value%2;
    *(binary+index) = r_value==0?'0':'1';
    int n = value/2;
    while(n>=2){
        r_value = n%2;
        index--;
        *(binary+index) = r_value==0?'0':'1';
        n = n/2;
    }
    r_value = n%2;
    index--;
    *(binary+index) = r_value==0?'0':'1';
    return binary;
}

上面函数第一个参数的类型,可以是int,long,unsigned int ,第二个参数表示生成数组的长度.
我们来测试一下,这个函数有没有达到我们的要求.

#include <time.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
using namespace std;

int main(){

        char* getBinaryArray(unsigned long value,int length);
        printf("size = %ld",sizeof(unsigned long));
        printf("\n");

        char* d = getBinaryArray(8,12);
        for(int i=0;i<12;i++){
                printf("d[%d] = %c -- ",i,*(d+i));
        }
        printf("\n");

}


char* getBinaryArray(unsigned long value,int length){
    int len = length;
    int index = len - 1;
    char* binary = (char*)malloc(sizeof(char)*len);
    memset(binary,'0',sizeof(char)*len);
    int r_value;
    r_value = value%2;
    *(binary+index) = r_value==0?'0':'1';
    int n = value/2;
    while(n>=2){
        r_value = n%2;
        index--;
        *(binary+index) = r_value==0?'0':'1';
        n = n/2;
    }
    r_value = n%2;
    index--;
    *(binary+index) = r_value==0?'0':'1';
    return binary;
}

命令行编译运行一下:
g+±4.8 -o getbinaryarraytest.out GetBinaryArrayTest.cpp
./getbinaryarraytest.out

结果如下:
size = 8
d[0] = 0 – d[1] = 0 – d[2] = 0 – d[3] = 0 – d[4] = 0 – d[5] = 0 – d[6] = 0 – d[7] = 0 – d[8] = 1 – d[9] = 0 – d[10] = 0 – d[11] = 0 –

这边因为我的设备是64位的,所以unsigned long型是8个字节,重点的是下面的输出结果.
000000001000

结果是我们想要的,没毛病.利用这个方法我们就可以得到其他几个值的二进制表示.
然后我们再利用memcpy函数把这几个二进制表示拼接起来就可以了.代码如下:

  1 #include <time.h>
  2 #include <iostream>
  3 #include <string.h>
  4 #include <stdlib.h>
  5 #include <stdio.h>
  6 #include <sstream>
  7 #include <math.h>
  8 using namespace std;
  9 
 10 int main(){
 11 
 12         char* getBinaryArray(unsigned long value,int length);
 13         printf("\n");
 14         printf("\n");
 15         char* d = getBinaryArray(8,12);
 16         for(int i=0;i<12;i++){
 17                 printf("d[%d] = %c -- ",i,*(d+i));
 18         }
 19         printf("\n");
 20         char* e = getBinaryArray(12,6);
 21         for(int i=0;i<6;i++){
 22                 printf("e[%d] = %c -- ",i,*(e+i));
 23         }
 24         printf("\n");
 25         char* f = getBinaryArray(33,6);
 26         for(int i=0;i<6;i++){
 27                 printf("f[%d] = %c -- ",i,*(f+i));
 28         }
 29         printf("\n");
 30         char* g = getBinaryArray(28,8);
 31         for(int i=0;i<8;i++){
 32                 printf("g[%d] = %c -- ",i,*(g+i));
 33         }
 34         printf("\n");
 35         char* kk=(char*)malloc(sizeof(char)*32);
 36         int hl=sizeof(char)*12;
 37         int ml = sizeof(char)*6;
 38         int sl = sizeof(char)*6;
 39         int fl = sizeof(char)*8;
 40         memcpy(kk,d,hl);
 41         memcpy(kk+hl,e,ml);
 42         memcpy(kk+hl+ml,f,sl);
 43         memcpy(kk+hl+ml+sl,g,fl);
 44 
 45         for(int i=0;i<32;i++){
 46                 printf(" %c ",*(kk+i));
 47         }
 48 
 49         unsigned long sum = 0;
 50         for(int i=0;i<32;i++){
 51             if(*(kk+i) == '1'){
 52                 sum = sum + 1*(long)pow(2,31-i);
 53             }
 54         }
 55         printf("\n");
 56		    printf("sum=%ld",sum);
 57         return 0;
 58 }
 59 
 60 char* getBinaryArray(unsigned long value,int length){
 61     int len = length;
 62     int index = len - 1;
 63     char* binary = (char*)malloc(sizeof(char)*len);
 64     memset(binary,'0',sizeof(char)*len);
 65     int r_value;
 66     r_value = value%2;
 67     *(binary+index) = r_value==0?'0':'1';
 68     int n = value/2;
 69     while(n>=2){
 70         r_value = n%2;
 71         index--;
 72         *(binary+index) = r_value==0?'0':'1';
 73         n = n/2;
 74     }
 75     r_value = n%2;
 76     index--;
 77     *(binary+index) = r_value==0?'0':'1';
 78     return binary;
 79 }

编译运行后结果如下:
d[0] = 0 – d[1] = 0 – d[2] = 0 – d[3] = 0 – d[4] = 0 – d[5] = 0 – d[6] = 0 – d[7] = 0 – d[8] = 1 – d[9] = 0 – d[10] = 0 – d[11] = 0 –
e[0] = 0 – e[1] = 0 – e[2] = 1 – e[3] = 1 – e[4] = 0 – e[5] = 0 –
f[0] = 1 – f[1] = 0 – f[2] = 0 – f[3] = 0 – f[4] = 0 – f[5] = 1 –
g[0] = 0 – g[1] = 0 – g[2] = 0 – g[3] = 1 – g[4] = 1 – g[5] = 1 – g[6] = 0 – g[7] = 0 –

0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0

sum=8593692

上面加粗的结果就是最终的,我们想要的二进制表示,它的十进制表示值是8593692.


上面的方法,确实实现了我们的需求,但是吧,这也太麻烦了吧.首先,需要把整型值转化成二进制表示,并用char 数组存起来,然后在内存拷贝进行拼接,最后如果想得到十进制的结果还需要再转化一下…比较麻烦,那能不能有简单点的方法呢? 我们可以用位操作运算来实现. 代码如下:

  1 #include<iostream>
  2 #include<stdio.h>
  3 int main(){
  4         unsigned int value = 0;
  5         unsigned int count = 28;
  6         unsigned int second = 33;
  7         unsigned int minute = 12;
  8         unsigned int hour = 8;
  9         //从低位到高位
 10         //set count
 11         value = 0 | count;
 12         //set second
 13         value = value | (second << 8);
 14         //set minute
 15         value = value | (minute << 14);
 16         //set hour
 17         value = value | (hour << 20);
 18         printf("%d",value);
 19 }


编译运行结果如下:
8593692

结果和上面的一样,但是思路完全不一样,代码量是不是少很多.通过这种方式,如果后端要求怎么控制32位的格式或者64位,我们都可以很方便的做到.

在这里插入图片描述


扫码加入我的个人微信公众号:Android开发圈 ,一起学习Android知识!!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34902522/article/details/86089375
今日推荐