c++的各种类型的二进制转换和输出
输出一个数的二进制表示:
从最高位开始,依次输出。
//输出n的二进制表示
void BinaryPrint(int n)
{
for(int i=0; i<32; ++i)
{
cout<<((n&0x80000000) == 0x80000000);
n = n<<1;
}
cout<<endl;
}
输出一个数二进制表示中1的个数:
n&(n-1)把n的最后一个变为0,因为n-1会使n最后一个1变为0,这个1后面的0变为1。
//判断n有多少位是1
int CheckBits(int n)
{
int ret = 0;
while(0 != n)
{
n = n&(n-1);
++ret;
}
return ret;
}
判断一个数是否为2的某次方:
特征:二进制表示中只有一位是1,其余为0。
n-1取反,为-n;若只有一位是1,则n-1后,该位之前的不变,后面位都与之前相反。
//判断n是否为2的某次方
bool CheckLog2(int n)
{
return (n&(-n)) == n;
}
利用类模板编译期求值优化二进制输出:
首先1字节对齐,每个struct包含两个成员,本位的值和下一位的struct,最后一个struct的本位值为0,这样data<32>就包含了33个字节,从最高位到最低位,还有个0。
将data<32>解释成为一个字符串输出,即为结果。
#include <iostream>
//1字节对齐
#pragma pack( push )
#pragma pack( 1 )
//类模板
template<int num ,int x>
struct data
{
data():c(enumData){}
enum { enumData = (x&0x80000000)?'1':'0' };
char c; //本位
data< (num -1), (x<<1) > SubData; //下一位
};
//类模板特化
template<int x>
struct data<0,x>
{
char c; //以0为结尾
data():c(0){}
};
#pragma pack( pop )
int main()
{
data<32,0x80000011> temp;
printf("%s\n",&temp);
std::cout<<sizeof(data<6,-4>)<<std::endl; //7
return 0;
}下面一篇blog介绍介绍三种将二进制字节字符转换为ASCII方法
-----------------
下面代码分别给出了三种将二进制字节字符转换为ASCII的方法
- /**
- * @brief 该函数实现了将二进制字节数据转换为可打印ASCII码字符串
- * @param[in] pSrc 源数据指针
- * @param[in] nSrcLength 源数据长度
- * @param[out] pDst 目标字符串指针
- * @return 目标字符串长度
- * @author wlq_729@163.com
- * http://blog.csdn.net/rabbit729
- * @version 1.0
- * @date 2009-02-25
- */
- #include <assert.h>
- #include <iostream>
- using namespace std;
- int BinaryBytes2String1(const unsigned char* pSrc, unsigned int nSrcLength, char* pDst)
- {
- if ( pSrc == 0 || pDst == 0 )
- return 0;
- char* p = pDst;
- for ( unsigned i = 0; i < nSrcLength; i++ )
- {
- *p = (pSrc[i] >> 4) & 0x0f;
- *p += *p < 10 ? 0x30 : (0x61 - 10);
- p++;
- *p = pSrc[i] & 0x0f;
- *p += *p < 10 ? 0x30 : (0x61 - 10);
- p++;
- }
- *p = '/0';
- return nSrcLength * 2;
- }
- int BinaryBytes2String2(const unsigned char* pSrc, unsigned int nSrcLength, char* pDst )
- {
- if ( pSrc == 0 || pDst == 0 )
- return 0;
- const char tab[]="0123456789abcdef";
- for(int i=0; i<nSrcLength; i++)
- {
- *pDst++ = tab[*pSrc >> 4];
- *pDst++ = tab[*pSrc & 0x0f];
- pSrc++;
- }
- *pDst = '/0';
- return nSrcLength * 2;
- }
- int BinaryBytes2String3(const unsigned char* pSrc, int nSrcLength, char* pDst)
- {
- if ( pSrc == 0 || pDst == 0 )
- return 0;
- for (int i = 0; i < nSrcLength; i++)
- {
- sprintf(pDst, "%02x", *pSrc);
- pDst++;
- pDst++;
- pSrc++;
- }
- *pDst = '/0';
- return nSrcLength * 2;
- }
- void main(void)
- {
- unsigned char test[3] = {0x23, 0xa4, 0xB7};
- char result[7];
- memset(result, 0, 7);
- BinaryBytes2String1(test, 3, result);
- cout<<result<<endl;
- BinaryBytes2String2(test, 3, result);
- cout<<result<<endl;
- BinaryBytes2String3(test, 3, result);
- cout<<result<<endl;
- }
输出结果为:
23a4b7
23a4b7
23a4b7
请按任意键继续. . .
浙公网安备 33010602011771号