Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 курс / 2 / 2 / Source

.cpp
Скачиваний:
14
Добавлен:
21.08.2019
Размер:
4.52 Кб
Скачать
#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;
}
Соседние файлы в папке 2
  • #
    21.08.20196.05 Кб142.vcxproj
  • #
    21.08.20191.02 Кб132.vcxproj.filters
  • #
    21.08.2019165 б132.vcxproj.user
  • #
    21.08.20194.52 Кб14Source.cpp