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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2011, 22:34   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию работа с битами

Имеются переменные a и b:
Код:
unsigned char a, b;
a = 4;
b = 15;
Необходимо ко второму биту переменой a прибавить 4-ый бит переменной b.
P.S. В c++ переменная, занимающая 1 байт имеет тип char или unsigned char? и только? Правильно? За исключением, что в каком-то файле имеется typedef, меняющий char на byte
Dimarik вне форума Ответить с цитированием
Старый 07.03.2011, 22:53   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Код:
Необходимо ко второму биту переменой a прибавить 4-ый бит переменной b.
Можно с помощью itoa сделать - перевести число в двоичную систему счисления и представить в виде массива.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 07.03.2011, 23:05   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Тут очень важна скорость, чтобы это всё происходило максимально быстро.
Dimarik вне форума Ответить с цитированием
Старый 08.03.2011, 00:06   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Sam Gold
Цитата:
Можно с помощью itoa сделать - перевести число в двоичную систему счисления и представить в виде массива.
да ты стебешься чтоль

2Dimarik
если я тя правильно понял (выполнить побитовое сложение конкретных битов), то вот
Код:
a |= ((a >> 1) | ((b >> 3) & 1)) << 1;
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.03.2011, 10:10   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

нужно ^ конкретных битов сделать. Неправильно в самом начале выразился. Но идея понятна. Я думал что есть способ быстрее, позволяющий конкретно к каждому биту обращаться без этих сдвигов.
Dimarik вне форума Ответить с цитированием
Старый 08.03.2011, 12:43   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Dimarik
Цитата:
Неправильно в самом начале выразился.
а кто мешал выразиться правильно?
Цитата:
Я думал что есть способ быстрее, позволяющий конкретно к каждому биту обращаться без этих сдвигов.
да, есть.

Код:
union DATA {
	struct {
		unsigned b0 : 1;
		unsigned b1 : 1;
		unsigned b2 : 1;
		unsigned b3 : 1;
		unsigned b4 : 1;
		unsigned b5 : 1;
		unsigned b6 : 1;
		unsigned b7 : 1;
	};
	unsigned char val;
};

int main ()
{
	union DATA a, b;

	a.val = 4;
	b.val = 15;

	a.b1 ^= b.b3;

	return 0;
}
быстрее это или медленнее, я не знаю
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.03.2011, 15:02   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

1. Прочитал про объединения в книге Стивена Праты. Пишет что объединения - те же самый структуры, только там переменный должны быть одного типа. И ещё он в примере писал что когда инициализацию проводишь, не надо писать union DATA a, b;, а просто DATA a, b; или можно и так и так?
2. а как понять эту строку unsigned b0 : 1?
никогда не сталкивался с типом unsigned. unsigned int, char и т.д. видел, но просто unsigned - нет. и что значит :1???
3. как вообще работает этот код? a.val = 5 - ну это понятно, а потом что? побитово расписывается? Если не трудно, подскажи где можно поподробней прочитать.
4. Я малость изменил код для решения малость другой задачи и... какая-то бредятина получалась. Дело в том что внутри сделал не b0,b1...b7, амассив, чтобы можно было циклом пройтись
Код:
/*собственно что хочу в цлике сделать....
	Пусть b[i] - каждый бит байта a.val
	b[i] ^= b[(i+4)%8] ^ b[(i+5)%8] ^ 
	b[(i+6)%8] ^ b[(i+7)%8] ^ c;
	где с для i равного 0,1,5,6 будет 1, для остальных 0.
	*/
ну а вот сам код
Код:
// побитовые_операции.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
 #include <fstream> 
using namespace std;

union DATA {
	struct {
		unsigned b[8];
	};
	unsigned char val;
};

int _tmain(int argc, _TCHAR* argv[])
{
	union DATA a;
	unsigned char  cArray[256];
	int rr = sizeof(unsigned char);
	fstream out;
	out.open("t.txt",ios::out);
	for (int i = 0; i < 256; i++)
		cArray[i] = i;
	/*собственно что хочу в цлике сделать....
	Пусть b[i] - каждый бит байта a.val
	b[i] ^= b[(i+4)%8] ^ b[(i+5)%8] ^ 
	b[(i+6)%8] ^ b[(i+7)%8] ^ c;
	где с для i равного 0,1,5,6 будет 1, для остальных 0.
	*/
	for (int i = 0; i < 256; i++)
	{
		a.val = cArray[i];
		for (int j = 0; j < 8; j++)
		{
			a.b[j] ^= a.b[(j+4)%8] ^ a.b[(j+5)%8]
				^ a.b[(j+6)%8] ^ a.b[(j+7)%8];
			if ((j == 0) || (j == 1) || (j == 5) || (j == 6))
				a.b[j] ^= 1;
			else
				a.b[j] ^= 0;
			
		}
		out<<(int)a.val<<" ";
	
	}
	out.close();
	system ("pause");
	return 0;
}
Dimarik вне форума Ответить с цитированием
Старый 08.03.2011, 15:11   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Плохо читал Прату. В объединении поля могут быть разного типа. Размер объединения это размер поля, у которого тип данных имеет больший размер. Например
Код:
union U
{
char c;
int i;
}
Если взять размер объединения sizeof(U), будет выведено 4 байта, так как это размер самого большего типа в объединении т.е. поля int i. Так же поля в объединении имеют один адрес. Т.е. адреса полей char c и int i будут одинаковы.
profi вне форума Ответить с цитированием
Старый 08.03.2011, 16:21   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

элементы находящиеся в объединении находятся в 1ой области памяти и изменение любого из них приведет к изменению других.
тут изменение конкретного бита в битовом поле, повлечет изменение этого же бита в переменной val.
onewho вне форума Ответить с цитированием
Старый 08.03.2011, 16:31   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

как я уже понял, это битовые поля (когда : 1)
а вот тут struct {
unsigned b[8];
}; если напишу : 1 - компилятор ругаться начинает
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с битами тотошкин Общие вопросы C/C++ 2 22.04.2010 12:06
Работа с битами. Masip Общие вопросы Delphi 2 13.04.2010 13:03
Работа с битами viktory Помощь студентам 8 02.10.2009 18:33
Работа с битами alexmikt Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.09.2009 13:24
Работа с битами в C dmitmal Общие вопросы C/C++ 5 20.05.2009 04:27