Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

у меня именно 16 бит int.
вот с наложением маски и побитовым И не получается, пример кода напишите, пожалуйста
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Через указатель.
Как-то примерно так:

Код: Выделить всё

#define  BYTE_0(v)   *((unsigned char*)&v+0)
#define  BYTE_1(v)   *((unsigned char*)&v+1)
Написал быстро от руки, возможно что-то не так, но смысл думаю понятен.
Реклама
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: Вопросы по С/С++ (СИ)

Сообщение phenomen »

Думаю, этот код не для начинающего.
Вот проще, без указателей и адресов:

Код: Выделить всё

#define BYTE_X(v,x) (unsigned char)(v >> x*8 & 0xFF)
x*8 - на сколько бит сдвигаем (байт = 8 бит)
v >> x*8 - сдвигаем нужный байт в младший
v >> x*8 & 0xFF - накладываем маску
Последний раз редактировалось phenomen Пт сен 27, 2013 12:33:22, всего редактировалось 1 раз.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
мне ее сохранить желательно.
я пока вот что методом тыка натыкал

Код: Выделить всё

int myvar_int =0b0100000010000010;
unsigned char f1 = myvar_int;
unsigned char f2 = myvar_int>>8;  
//получается
f1 == 0b10000010
f2 == 0b01000000


вот как теперь f1 и f2 вместе собрать, обратно в int?
Реклама
Эиком - электронные компоненты и радиодетали
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: Вопросы по С/С++ (СИ)

Сообщение phenomen »

С помощью битового ИЛИ (операция | )и сдвигом влево старшего байта (<<)
Попробуйте сами.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

AaNnDdRrEeYy писал(а):через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
Ничего нигде не будет разбиваться. Просто компилятор будет обращаться как к однобайтовым переменным по нужным адресам.
AaNnDdRrEeYy писал(а):вот как теперь f1 и f2 вместе собрать, обратно в int?
Через тот-же указатель:

Код: Выделить всё

myvar_int = *(unsisned int*)&f1;
Зы: вообще, правильнее это всё делать через union.
Реклама
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

все, всем спасибо, разобрался

Код: Выделить всё

int myvar_int =0b0100000010000010;
unsigned char f1 = myvar_int;
unsigned char f2 = myvar_int>>8;  
//получается
f1 == 0b10000010
f2 == 0b01000000

//и обратно, f2 проталкиваю на 8 бит вперед а f1 вагончиком сзади

nt myvar2 = f2<<8|f1;

Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Код: Выделить всё

unsigned char f1 = myvar_int;
Тогда уж так:

Код: Выделить всё

unsigned char f1 = (unsigned char)myvar_int;
unsigned char f2 = (unsigned char)(myvar_int>>8)
Но лучше освойте указатели.

Кстати, в первом случае компилятор просто обратится к младшему байту, во втором может впендюрить цикл из 8 LSR/ROL в зависимости от настроек оптимизации.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

через указатели эффект другой получается, можно через переменную char изменить переменную int

Код: Выделить всё


myvar_int = =0b0100000010000010; 

unsigned char f1 =  *((unsigned char*)&myvar_int+0);
unsigned char f2 =  *((unsigned char*)&myvar_int+1);
    
f1 = 0xFF;

int myvar2 = f2<<8|f1;
//  myvar_int  будет отличаться  myvar2  

но с другой стороны, оперативки меньше на два байта расходуется, покрайней мере хочется в это верить.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

можно через переменную char изменить переменную int
Так а вы это... попробуйте не менять :))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Код: Выделить всё

union{
    long                _int32;
    struct{
        int short       _int16_0;
        int short       _int16_1;
    };
    struct{
        unsigned char   _int8_0;
        unsigned char   _int8_1;
        unsigned char   _int8_2;
        unsigned char   _int8_3;
    };
}my_var;

................
................

my_var._int32=0x3355AAFF;
/*
Теперь:
my_var._int16_0 = 0xAAFF
my_var._int16_1 = 0x3355
my_var._int8_0 = 0xFF
my_var._int8_1 = 0xAA
my_var._int8_2 = 0x55
my_var._int8_3 = 0x33
*/
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ? :)
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

работает ! только я вот так переписал

Код: Выделить всё

union 
{
    int _int16;

	struct
	{
		unsigned char _int8_0;
		unsigned char _int8_1;
	};

} my_int_var;

unsigned char f1 =  my_int_var._int8_1;
unsigned char f2 =  my_int_var._int8_0;
ну и места жрет больше чем все другие варианты, 142 байта

без указателей, 130 байт

Код: Выделить всё

unsigned char f1 = (unsigned char)myvar_int;
unsigned char f2 = (unsigned char)(myvar_int>>8)
с указателями 134 бата

Код: Выделить всё

unsigned char f1 =  *((unsigned char*)&myvar_int+0);
unsigned char f2 =  *((unsigned char*)&myvar_int+1);
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

ну и места жрет
Ровно столько, сколько Вы используете.
my_int_var у Вас занимает 2 байта.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение AaNnDdRrEeYy »

Аlex писал(а):
AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ? :)
да запутался, только сейчас сообразил.
сливать их в кучу не надо достаточно изменить одну переменную и значение в переменной int тоже поменяется.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

AaNnDdRrEeYy писал(а):достаточно изменить одну переменную и значение в переменной int тоже поменяется.
Это касается только union. В остальных вариантах такое не будет происходить, т.к. у каждой переменной своя область памяти. А у union она одна !
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Добрый день,подскажите: делаю куб на сдвиговых регистрах, неправильно припаял ножки,чтобы непеределывать надо сделать функцию смещения бита, тоесть 256 бит сместить на 8192, а 512 на 16384:

Вот пример,который неполучился,изза сложения x|,потомучто при отсутствия всеравно выводит(если раньше было):

z=x|((x&256)<<5);

Короче подскажите функцию смещения одного бита из числа)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Короче подскажите функцию смещения одного бита из числа)
Ничё не понял.
Надо поменять местами 2 бита в числе?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

спящий, эко тебя понесло) Поток мыслей, но я ничего не понял)
Ставим плюсы: )
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

:))) :))) :)))
Ответить

Вернуться в «Разные вопросы по МК»