Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 22:42   #1
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию битовые поля

Посмотрите, пожалуйста, код (:
Задание такое: реализовать алгоритм восстановления значения целого отрицательного числа по его дополнительному двоичному коду. Значение восстанавливаемого отрицательного числа вводится с клавиатуры, результат на экран.

Код:
#include <iostream>
#include <conio.h>

using namespace System;


int main(array<System::String ^> ^args)
{
    
int B;
int A;
std::cout<<"BBeguTe 4ucJIo: ";
std::cin>>u.B;
union {
	char B;
	struct {unsigned b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1,b8:1; }BB;
	}u;



std::cin>>u.BB.b8;
std::cin>>u.BB.b7;
std::cin>>u.BB.b6;
std::cin>>u.BB.b5;
std::cin>>u.BB.b4;
std::cin>>u.BB.b3;
std::cin>>u.BB.b2;
std::cin>>u.BB.b1;

A=u.BB.b8+u.BB.b7*2+u.BB.b6*2+u.BB.b5*2+u.BB.b4*2+u.BB.b3*2+u.BB.b2*2+u.BB.b1*2;

std::cout<<"A="<<A<<std::endl;
	getch();
	return 0;
}
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 02.12.2009, 23:23   #2
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

немного по копалась кое что исправила
Код:
#include <iostream>
#include <conio.h>

using namespace System;




int main(array<System::String ^> ^args)
{
    
//char B;
char A;

union {
	char B;
	struct {unsigned char b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1,b8:1; }BB;
	}u;

std::cout<<"BBeguTe 4ucJIo: "<<std::endl;
std::cin>>u.B;


std::cin>>u.BB.b8;
std::cin>>u.BB.b7;
std::cin>>u.BB.b6;
std::cin>>u.BB.b5;
std::cin>>u.BB.b4;
std::cin>>u.BB.b3;
std::cin>>u.BB.b2;
std::cin>>u.BB.b1;

A=u.BB.b8+u.BB.b7*2+u.BB.b6*2+u.BB.b5*2+u.BB.b4*2+u.BB.b3*2+u.BB.b2*2+u.BB.b1*2;

std::cout<<"A="<<A<<std::endl;
	getch();
	return 0;
}
выдает вот такое:

>.\62.cpp(33) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'unsigned char' (or there is no acceptable conversion)
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\istream(1144): could be 'std::basic_istream<_Elem,_Traits> &std:perator >><std::char_traits<char>>(std::bas ic_istream<_Elem,_Traits> &,signed char *)' [found using argument-dependent lookup]
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 02.12.2009, 23:41   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А для этого обязательно использовать битовые поля? Может можно как-нибудь так:
Код:
#include <iostream>
#include <conio.h>

using namespace std;

int s(char* str)
{
	int ans = 0;

	int n = strlen(str)-1;
	for(int i = 0; str[i] != 0; i++) {
		ans |= ((str[i]-0x30)? 1 : 0) << n;
		n--;
	}

	return ~ans+1;
}

int main()
{
	char number[10];

	cout << "Enter number: ";
	cin.getline(number, 10);

	cout << "Answer is: " << s(number) << endl;
	
	getch();
	return 0;
}
? Впрочем, может я неправильно задание понял..
netrino вне форума Ответить с цитированием
Старый 02.12.2009, 23:47   #4
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

просто тема полей, так что обязательно
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 03.12.2009, 00:05   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну тогда можно вот так попробовать:
Код:
#include <iostream>
#include <conio.h>

using namespace std;

union Byte {
	char c;
	struct {
		char _0 : 1;
		char _1 : 1;
		char _2 : 1;
		char _3 : 1;
		char _4 : 1;
		char _5 : 1;
		char _6 : 1;
		char _7 : 1;
	} bit;
};

int main()
{
	char number[10] = { 0 };
	Byte N;

	cout << "Enter number: ";
	for(int i = 0; i < 8; i++)    // Ввод восьми битов байта
		cin >> number[i]; // в строку

	N.bit._0 = number[7] - 0x30; // Записываем значения разрядов в соответствующие ячейки в битовом поле
	N.bit._1 = number[6] - 0x30; // Самый правый разряд имеет наименьший вес
	N.bit._2 = number[5] - 0x30; // В Аски-таблице 0x30 - 0x39 обозначают цифры 0 .. 9
	N.bit._3 = number[4] - 0x30;
	N.bit._4 = number[3] - 0x30;
	N.bit._5 = number[2] - 0x30;
	N.bit._6 = number[1] - 0x30;
	N.bit._7 = number[0] - 0x30;


	cout << "Answer is: " << (int)(~N.c + 1) << endl; // Выводим ответ. ~ - отрицание числа
	
	getch();
	return 0;
}

Последний раз редактировалось netrino; 03.12.2009 в 00:28.
netrino вне форума Ответить с цитированием
Старый 03.12.2009, 00:23   #6
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

эммм... если честно я совершенно ни чего не поняла ;(
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 03.12.2009, 00:27   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Arcueid1691 Посмотреть сообщение
эммм... если честно я совершенно ни чего не поняла ;(
А конкретней? ) Добавил комментарии.
netrino вне форума Ответить с цитированием
Старый 03.12.2009, 00:31   #8
Arcueid1691
Пользователь
 
Аватар для Arcueid1691
 
Регистрация: 31.05.2009
Сообщений: 97
По умолчанию

ну вот разряды, можно их более подробно??? ):
спят подружки вредные безмятежным сном,
Снятся мышкам хлебные крошки под столом, Буратинам - досточки, кошкам - караси,
Всем собакам - косточки, программистам - Си (с)
Arcueid1691 вне форума Ответить с цитированием
Старый 03.12.2009, 00:37   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вот вводим мы например 00000101. Соответственно ячейки массива number будут заполнены так:
Код:
number[0] = 0;
number[1] = 0;
number[2] = 0;
number[3] = 0;
number[4] = 0;
number[5] = 1;
number[6] = 0;
number[7] = 1;
Теперь записываем значения этого добра в соответствующие биты нашего числа. Самый младший бит в числе находится справа, с него и начинается отчёт, потому самую правую введённую цифру записываем в нулевой бит:
Код:
N.bit._0 = number[7] - 0x30;
Соответственно в 1-й бит записываем number[6]-0x30 и так далее
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции ("")(Э_Є)("") Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 04.07.2009 13:19
Битовые операции ("")(Э_Є)("") Общие вопросы C/C++ 4 03.07.2009 19:15
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40
Битовые операции zetrix Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 15.12.2006 11:08