我目前正在将十进制转换为二进制,确保它是8位。除〜(NOT)操作外,所有位操作都有效。它们是一个巨大的整数值。我不知道为什么,因为其他位操作工作。这是我的代码:(注释掉的行是不起作用的)
编辑:如果我想获得8位二进制字符串,我该怎么办?使用未签名的字符?如果我将所有无符号整数更改为无符号字符,则我的BinaryToDecimal函数会产生错误的二进制转换。
#include <iostream>
#include <string>
using namespace std;
string BinaryToDecimal(unsigned int dec)
{
string binary = "";
float remainder = 0.0f;
while( dec != 0 )
{
remainder = dec % 2;
dec /= 2;
if( remainder == 0 )
binary.append("0");
else
binary.append("1");
}
// Reverse binary string
string ret = string(binary.rbegin(), binary.rend());
return ret;
}
int main()
{
unsigned int a = 0;
unsigned int b = 0;
cout << "Enter a number to convert to binary: ";
cin >> a;
cout << "Enter a number to convert to binary: ";
cin >> b;
cout << "A = " << BinaryToDecimal(a) << endl;
cout << "B = " << BinaryToDecimal(b) << endl;
unsigned int c = a & b;
unsigned int d = a | b;
//unsigned int e = ~a;
//unsigned int f = ~b;
unsigned int g = a ^ b;
unsigned int h = a << 2;
unsigned int i = b >> 3;
cout << "A & B = " << BinaryToDecimal(c) << endl;
cout << "A | B = " << BinaryToDecimal(d) << endl;
//cout << "~A = " << BinaryToDecimal(e) << endl;
//cout << "~B = " << BinaryToDecimal(f) << endl;
cout << "A ^ B = " << BinaryToDecimal(g) << endl;
cout << "A << 2 = " << BinaryToDecimal(h) << endl;
cout << "B >> 3 = " << BinaryToDecimal(i) << endl;
}
答案 0 :(得分:2)
如果对小的无符号整数执行二进制NOT,则会得到一个大数,因为大多数最高有效位将被设置为1(它们在操作数中的反转)。
在这种情况下,你正在做~ 0
,它肯定会给你一个很大的数字,实际上是最大的无符号整数,因为所有的位都将被设置为1。
(你期待什么结果?)
答案 1 :(得分:0)
您正在使用unsigned int
进行操作,因为从MSB开始,前导1会导致小数的反转变为大数。如果您只希望表示仅为8位,则应使用unsigned char
进行存储
但您无法将a或b更改为unsigned char
。否则,cin >> a
会将号码的ASCII码设为a
,而不是数字。例如,您的输入为5,它输入0x35('5'),而不是数字5。
如果您不想更改代码的unsigned int
,可以进行一些小的改进
string BinaryToDecimal(unsigned int dec)
{
string binary = "";
float remainder = 0.0f;
dec &= 0xff; // only 8 bits you care about
while( dec != 0 )
{
....
但是你正在使用while( dec !=0 )
,这是有缺陷的。如果结果已经为0,则函数返回空字符串,而不是“0000”。相反,您应该使用计数器仅计数8位。
for (int i = 0; i < 8; i++ ) {
if ((dec & 1) != 0)
binary.append("1");
else
binary.append("0");
dec >>= 1;
}
此外,使用位智能AND
来测试该位是0或1,并且移位操作优于/和%运算符。
最后,对于8位5(0000_0101),其反转为250(1111_1010),而不是1010。