Добавил:
TaskeFox
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
class BitString
{
unsigned long long left;
unsigned long long right;
public:
BitString(unsigned long long left, unsigned long long right) :left(left), right(right) { }
void shiftLeft(int k)
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum = Summ(s1, s2);
for (int i = 0; i < k; i++)
{
for (int j = 0; j < sum.length() - 1; j++)
{
swap(sum[j], sum[j + 1]);
}
sum[sum.length() - 1] = '0';
}
cout << sum << endl;
}
void shiftRight(int k)
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum = Summ(s1, s2);
for (int i = 0; i < k; i++)
{
for (int j = sum.length() - 1; j > 0; j--)
{
swap(sum[j], sum[j - 1]);
}
sum[0] = '0';
}
cout << sum << endl;
}
void myAnd(BitString val)
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum1 = Summ(s1, s2);
s1 = bitset<65>(val.left).to_string();
s2 = bitset<65>(val.right).to_string();
string sum2 = Summ(s1, s2);
string res = "";
for (int i = 0; i < sum1.length(); i++)
{
if (sum1[i] == '1' && sum2[i] == '1')
res += '1';
else
res += '0';
}
cout << res << endl;
}
void myOr(BitString val)
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum1 = Summ(s1, s2);
s1 = bitset<65>(val.left).to_string();
s2 = bitset<65>(val.right).to_string();
string sum2 = Summ(s1, s2);
string res = "";
for (int i = 0; i < sum1.length(); i++)
{
if (sum1[i] == '1' || sum2[i] == '1')
res += '1';
else
res += '0';
}
cout << res << endl;
}
void myXor(BitString val)
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum1 = Summ(s1, s2);
s1 = bitset<65>(val.left).to_string();
s2 = bitset<65>(val.right).to_string();
string sum2 = Summ(s1, s2);
string res = "";
for (int i = 0; i < sum1.length(); i++)
{
if ((sum1[i] == '1' && sum2[i] == '0') || (sum1[i] == '0' && sum2[i] == '1'))
res += '1';
else
res += '0';
}
cout << res << endl;
}
void myNot()
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum1 = Summ(s1, s2);
string res = "";
for (int i = 0; i < sum1.length(); i++)
{
if (sum1[i] == '1')
res += '0';
else
res += '1';
}
cout << res << endl;
}
int count()
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
string sum = Summ(s1, s2);
int count = 0;
for (int i = 0; i < sum.length(); i++)
{
if (sum[i] == '1')
count++;
}
return count;
}
void sravnenie(BitString obj)
{
if (this->count() > obj.count())
{
cout << "a > b" << endl;
}
else if (this->count() == obj.count())
{
cout << "a == b" << endl;
}
else
{
cout << "a < b " << endl;
}
}
void print()
{
string s1 = bitset<65>(left).to_string();
string s2 = bitset<65>(right).to_string();
cout << Summ(s1, s2) << endl;
}
string Summ(string s1, string s2)
{
int len1 = s1.size();
int len2 = s2.size();
// Выровняем длины строк
string ls1 = len1 < len2 ? s1 : s2;
string ls2 = len1 < len2 ? s2 : s1;
for (int i = ls1.size(); i < ls2.size(); ++i) ls1 = '0' + ls1;
string result;
int carry = 0;
for (int i = ls2.size() - 1; i >= 0; --i) {
int bit1 = ls1.at(i) - '0'; // '0' => 0, '1' => 1
int bit2 = ls2.at(i) - '0';
char sum = (bit1 ^ bit2 ^ carry) + '0';
result = sum + result;
carry = (bit1&carry) | (bit2&carry) | (bit1&bit2);
}
if (carry) result = '1' + result;
return result;
}
};
//18446744073709551615
int main()
{
BitString b1(0, 418);
BitString b2(0, 210);
cout << "a : " << endl;
b1.print();
cout << "b : " << endl;
b2.print();
cout << endl;
cout << "a >> 3" << endl;
b1.shiftRight(3);
cout << "a << 3" << endl;
b1.shiftLeft(3);
cout << "a & b" << endl;
b1.myAnd(b2);
cout << "a | b" << endl;
b1.myOr(b2);
cout << "a ^ 3" << endl;
b1.myXor(b2);
cout << "~a" << endl;
b1.myNot();
cout << "a > b ??" << endl;
b1.sravnenie(b2);
system("pause");
return 0;
}