Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char как целочисленный тип 
:(
    Опции темы
Никто
Дата 3.8.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Получится ли использовать char в качестве целочисленного типа.Нужно создать очень большой массив данных меньше десяти,это займет много памяти.Даже при типе short.И надо ли использовать перевод типов int-str.
--------------------
   
PM MAIL   Вверх
dumb
Дата 3.8.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



не надо никаких преобразований. char - 8-ми битовый тип. то, что тебе нужно.

Код

char * big_array = new char[10000000];
//варианты обращений:
big_array[10] = 5;
*(big_array + 20) = 8;
delete [] big_array;

PM MAIL   Вверх
Nuzur
Дата 3.8.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



dumb, ну или unsigned char смотря что нуна smile


--------------------
Never again...
PM MAIL   Вверх
Никто
Дата 3.8.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Спасибо. smile 
--------------------
   
PM MAIL   Вверх
dumb
Дата 3.8.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



и, если числа действительно меньше 10, то немного усложнив обращение к элементам, можно сэкономить в 2 раза. на числа до 16 нужно только 4 бита, т.е. в одном байте у тебя уместится 2 числа.

что-то вроде того:
Код

inline unsigned char get_num( unsigned char * array, unsigned long index )
{
  return index % 2 ? array[ index / 2 ] & 0xF : array[ index / 2 ] >> 4;
}
inline void set_num( unsigned char * array, unsigned long index, unsigned char value )
{
  array[ index / 2 ] = index % 2 ? ( array[ index / 2 ] & 0xF0 ) | ( value & 0xF ) : ( array[ index / 2 ] & 0xF ) | ( value << 4 );
}

хм... выглядит как-то кривовато. ну да компилер оптимизнет... smile

Цитата(Nuzur @  3.8.2006,  17:17 Найти цитируемый пост)
ну или unsigned char смотря что нуна

если числа до 10, то, в случае использования всего байта, это неважно. smile
PM MAIL   Вверх
Никто
Дата 3.8.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Два раза спасибо. smile 

Это сообщение отредактировал(а) Никто - 3.8.2006, 18:03
--------------------
   
PM MAIL   Вверх
Mayk
Дата 3.8.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(dumb @  3.8.2006,  21:33 Найти цитируемый пост)
на числа до 16 нужно только 4 бита, т.е. в одном байте у тебя уместится 2 числа.

Если данных много, то подобные манипуляции могут существенно замедлить работу программы. 
Хотя подобно конечно может быть полезно для сохранения данных на диск и т.п.
Да и просто интересно с теоретической . зрения smile

Кстати. Вот навскидку ещё один вариант для получения значения из упакованного массива. 
Выполнится за ~6 операций, но не требует ветвления.


Код

inline unsigned char get_num( unsigned char * array, unsigned long index )
{
     int shift = (index & 1) << 2;  //1<<2 = 4,    0<<2= 0
     return (array[index>>1] >> shift) & 0xF;
}
 

Это сообщение отредактировал(а) Mayk - 3.8.2006, 18:22


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Никто
Дата 3.8.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Что в этом случае делают << и >>,и как понять 0xF.
--------------------
   
PM MAIL   Вверх
Mayk
Дата 4.8.2006, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Никто @  3.8.2006,  18:44 Найти цитируемый пост)
Что в этом случае делают << и >>,и как понять 0xF. 


Цитата(Mayk @  3.8.2006,  18:14 Найти цитируемый пост)
int shift = (index & 1) << 2;

здесь мы высчитываем смещения полубайта из которого надо брать значение. 
Если индекс нечётный, то shift = 4, иначе 0.

Цитата(Mayk @  3.8.2006,  18:14 Найти цитируемый пост)
index>>1

Здесь это то же самое что и index/2. 

Цитата(Mayk @  3.8.2006,  18:14 Найти цитируемый пост)
(array[index>>1] >> shift)

Здесь происходит сдвиг вправо на shift битов вправо. 
Если индекс был нечётным, то старший полубайт перейдёт в младший. Иначе ничего никуда не перейдёт.

Цитата(Mayk @  3.8.2006,  18:14 Найти цитируемый пост)
& 0xF;

это оставляет первые четыре бита и зануляет все остальные.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Никто
Дата 4.8.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Интересно,я раньше не знал.
--------------------
   
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.