Вопросы по С/С++ (СИ)
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
у меня именно 16 бит int.
вот с наложением маски и побитовым И не получается, пример кода напишите, пожалуйста
вот с наложением маски и побитовым И не получается, пример кода напишите, пожалуйста
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Через указатель.
Как-то примерно так:Написал быстро от руки, возможно что-то не так, но смысл думаю понятен.
Как-то примерно так:
Код: Выделить всё
#define BYTE_0(v) *((unsigned char*)&v+0)
#define BYTE_1(v) *((unsigned char*)&v+1)
Re: Вопросы по С/С++ (СИ)
Думаю, этот код не для начинающего.
Вот проще, без указателей и адресов:
x*8 - на сколько бит сдвигаем (байт = 8 бит)
v >> x*8 - сдвигаем нужный байт в младший
v >> x*8 & 0xFF - накладываем маску
Вот проще, без указателей и адресов:
Код: Выделить всё
#define BYTE_X(v,x) (unsigned char)(v >> x*8 & 0xFF)
v >> x*8 - сдвигаем нужный байт в младший
v >> x*8 & 0xFF - накладываем маску
Последний раз редактировалось phenomen Пт сен 27, 2013 12:33:22, всего редактировалось 1 раз.
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
мне ее сохранить желательно.
я пока вот что методом тыка натыкал
вот как теперь f1 и f2 вместе собрать, обратно в int?
мне ее сохранить желательно.
я пока вот что методом тыка натыкал
Код: Выделить всё
int myvar_int =0b0100000010000010;
unsigned char f1 = myvar_int;
unsigned char f2 = myvar_int>>8;
//получается
f1 == 0b10000010
f2 == 0b01000000
вот как теперь f1 и f2 вместе собрать, обратно в int?
Re: Вопросы по С/С++ (СИ)
С помощью битового ИЛИ (операция | )и сдвигом влево старшего байта (<<)
Попробуйте сами.
Попробуйте сами.
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ничего нигде не будет разбиваться. Просто компилятор будет обращаться как к однобайтовым переменным по нужным адресам.AaNnDdRrEeYy писал(а):через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
Через тот-же указатель:AaNnDdRrEeYy писал(а):вот как теперь f1 и f2 вместе собрать, обратно в int?
Код: Выделить всё
myvar_int = *(unsisned int*)&f1;
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
все, всем спасибо, разобрался
Код: Выделить всё
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;
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
через указатели эффект другой получается, можно через переменную 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
Re: Вопросы по С/С++ (СИ)
Так а вы это... попробуйте не менятьможно через переменную char изменить переменную int
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ?
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
работает ! только я вот так переписал
ну и места жрет больше чем все другие варианты, 142 байта
без указателей, 130 байт
с указателями 134 бата
Код: Выделить всё
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;
без указателей, 130 байт
Код: Выделить всё
unsigned char f1 = (unsigned char)myvar_int;
unsigned char f2 = (unsigned char)(myvar_int>>8)
Код: Выделить всё
unsigned char f1 = *((unsigned char*)&myvar_int+0);
unsigned char f2 = *((unsigned char*)&myvar_int+1);
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ровно столько, сколько Вы используете.ну и места жрет
my_int_var у Вас занимает 2 байта.
-
AaNnDdRrEeYy
- Встал на лапы
- Сообщения: 100
- Зарегистрирован: Ср дек 24, 2008 11:59:24
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
да запутался, только сейчас сообразил.Аlex писал(а):Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ?
сливать их в кучу не надо достаточно изменить одну переменную и значение в переменной int тоже поменяется.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Это касается только union. В остальных вариантах такое не будет происходить, т.к. у каждой переменной своя область памяти. А у union она одна !AaNnDdRrEeYy писал(а):достаточно изменить одну переменную и значение в переменной int тоже поменяется.
Re: Вопросы по С/С++ (СИ)
Добрый день,подскажите: делаю куб на сдвиговых регистрах, неправильно припаял ножки,чтобы непеределывать надо сделать функцию смещения бита, тоесть 256 бит сместить на 8192, а 512 на 16384:
Вот пример,который неполучился,изза сложения x|,потомучто при отсутствия всеравно выводит(если раньше было):
z=x|((x&256)<<5);
Короче подскажите функцию смещения одного бита из числа)
Вот пример,который неполучился,изза сложения x|,потомучто при отсутствия всеравно выводит(если раньше было):
z=x|((x&256)<<5);
Короче подскажите функцию смещения одного бита из числа)
Re: Вопросы по С/С++ (СИ)
Ничё не понял.Короче подскажите функцию смещения одного бита из числа)
Надо поменять местами 2 бита в числе?
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
спящий, эко тебя понесло) Поток мыслей, но я ничего не понял)
Ставим плюсы: )


