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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 17:33   #1
Gangsta15
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 12
По умолчанию Как разбить 32-битное целое, на 4 8-битных целых?

К примеру есть переменные:
PHP код:
usigned long address;
unsigned char num[4]; 
переменная address - 32 бита, в нее записан IP адресс (IPv4), в каждом бите по значению. Как разбить её на 4 байта? (элементы массива num)
Мне кажется нужно из нее читать со смещением по адресу переменной. Интерес у меня - практический, прошу показать как это сделать и объяснить.
Gangsta15 вне форума Ответить с цитированием
Старый 08.01.2012, 17:52   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

с помощью маски выбираешь необходимые 8 битов и сдвигаешь к началу, приводишь к char-ке.
onewho вне форума Ответить с цитированием
Старый 08.01.2012, 17:56   #3
Gangsta15
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
с помощью маски выбираешь необходимые 8 битов и сдвигаешь к началу, приводишь к char-ке.
Можете показать на примере?
Gangsta15 вне форума Ответить с цитированием
Старый 08.01.2012, 18:06   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

хз, вот сделал, но боюсь что быдлокод(
Код:
	const unsigned long ul = 256 ; //std::numeric_limits<unsigned long>::max();

	const u8 a[4] = {
		(u8)ul&0xff,
		(u8)((ul&(0xff<<8))>>8),
		(u8)((ul&(0xff<<16))>>16),
		(u8)((ul&(0xff<<24))>>24)
	};

	for (int i=0; i<4; i++)
		std::cout << (int)a[i] << '\n';
onewho вне форума Ответить с цитированием
Старый 08.01.2012, 18:11   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Gangsta15

переменная address - 32 бита, в нее записан IP адресс (IPv4), в каждом бите по значению. Как разбить её на 4 байта? (элементы массива num)

йоу! ((((Ж

memcpy(num, &address, sizeof(long));
Rififi вне форума Ответить с цитированием
Старый 08.01.2012, 18:17   #6
Gangsta15
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 12
По умолчанию

Объясни если не трудно что делается в этих строках:
PHP код:
(u8)ul&0xff,
(
u8)((ul&(0xff<<8))>>8),
(
u8)((ul&(0xff<<16))>>16),
(
u8)((ul&(0xff<<24))>>24
Понимаю что идет смещение и приводится к типу char, но это поверхностно. Объясни алгоритм.
Gangsta15 вне форума Ответить с цитированием
Старый 08.01.2012, 18:32   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

0xff - 8 единичек
& - битовое Или,
сдвиг, или, сдвиг обратно... и всё.
onewho вне форума Ответить с цитированием
Старый 08.01.2012, 18:35   #8
Gangsta15
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Gangsta15

переменная address - 32 бита, в нее записан IP адресс (IPv4), в каждом бите по значению. Как разбить её на 4 байта? (элементы массива num)

йоу! ((((Ж

memcpy(num, &address, sizeof(long));
Спасибо. Очень простое решение.

Цитата:
Сообщение от onewho Посмотреть сообщение
0xff - 8 единичек
& - битовое Или,
сдвиг, или, сдвиг обратно... и всё.
Спасибо, буду разбираться.

Последний раз редактировалось Gangsta15; 08.01.2012 в 18:39.
Gangsta15 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны последовательность из n целых чисел и целое число a. Solnze2 C# (си шарп) 1 06.06.2011 10:31
В переменной Х храниться целое число, разбить на разряды LION7777 Общие вопросы C/C++ 1 31.05.2010 23:34
С++ : Как разбить целое число на составляющие? Maruff Помощь студентам 6 17.06.2009 16:00