c++位操作如何打印出16、32位
c++ bit operations how to print out 16, 32 bits
目前我有一个脚本,它将数值打印成位,例如
print((short) 1);
我得到的值是00000001
,但我怎么能得到像00000001 00000000
这样的值呢?如果我打印print((int) 1);
,我会得到00000001 00000000 00000000 00000000
的值。这是我的代码:
void printbyte(unsigned char x)
{
for (int i = 0; i < 8; i++)
{
if (x & 0x80) cout << 1;
else cout << 0;
x = x << 1;
}
cout << endl;
}
template <typename T>
void print (T A)
{
unsigned char *p = (unsigned char *) &A;
printbyte(*p);
}
int main()
{
print((short) 1);
system("pause");
return 0;
}
您可以在print
中使用sizeof(T)
来确定要处理的字节数,然后为每个字节调用printbyte
,例如
#include <iostream>
#include <climits>
using namespace std;
void printbyte(unsigned char x)
{
for (int i = 0; i < CHAR_BIT; i++)
{
cout << ((x & 0x80) != 0);
x <<= 1;
}
}
template <typename T>
void print (T A)
{
for (size_t i = 0; i < sizeof(T); ++i)
{
unsigned char b = A >> ((sizeof(T) - i - 1) * CHAR_BIT);
//unsigned char b = A >> (i * CHAR_BIT); // use this for little endian output
printbyte(b);
cout << " ";
}
cout << endl;
}
int main()
{
print((short) 1);
print((long long) 42);
return 0;
}
您可以使用位集,这是最简单的方法。这里有一个例子:
#include <iostream>
#include <bitset>
using namespace std;
int main ()
{
int number;
cin>>number;
bitset <16> end (number);
cout<<number<<" --> "<<end<<'n';
return 0;
}
或参考:http://www.cplusplus.com/reference/bitset/bitset/
如果你不想使用标准解决方案,它也可以看起来像这样:
#include <iostream>
#include <climits>
using namespace std;
template <typename Type>
void bprint(Type in)
{
unsigned char* p = (reinterpret_cast<unsigned char*>(&in))+(sizeof(Type)-1); //x86
for(unsigned int n = sizeof(Type);n--;--p, std::cout<<' ')
for(unsigned int i = CHAR_BIT;i--;)
std::cout<<((*p&char(1<<i))!=0);
std::cout<<'n';
}
int main(void)
{
int number;
cin>>number;
bprint(number);
bprint(short(number));
bprint(char(number));
return 0;
}
如果默认情况下未设置,则需要在"char*"之前加上"unsigned"。根据标准,对变量内存的访问只有一个变量类型的指针或无符号字符。
最有趣的选择是使用数学,Gynvael Coldwind在这里描述了这一点:http://gynvael.coldwind.pl/n/c_cpp_number_to_binary_string_01011010。
我认为您应该使用std::bitset,但您必须在编译时指定大小。为了避免这种情况,您可以使用这样的模板函数(注意这是C++11(:
#include <iostream>
#include <bitset>
#include <limits>
template <class T> void PrintBits (const T &Number) {
std::bitset<std::numeric_limits<T>::digits> Bit_Number(Number);
std::cout << Bit_Number << std::endl;
}
相关文章:
- 将应用程序从32位移植到64位时出现问题
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 浮点数为 32 位和 64 位二进制表示形式
- C++易失性:保证 32 位访问?
- C++将 16 位值转换为 32 位值
- 如何在 64 位平台上计算 32 位哈希C++?
- C++中的24位到32位转换
- 在机器字大小等于 32 位的计算机上int64_t如何工作?
- uint32_t如何保证 32 位?
- 将代码从 32 位迁移到 64 位时出现问题 Visual Studio 2010
- 如何将32位字符与内联assembelyc++中的32位字符进行比较
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- x86 32位对Cuda的支持
- 我把我的编译器从32位转换为64位,但我仍然不能使用超过2GB:(为什么
- 如何使用Canny到32位灰度
- 如何忽略32位整数中的特定位
- c++位操作如何打印出16、32位
- 在打印机上打印(windows平台32位)