Страница 168 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:17:29
AaNnDdRrEeYy
у меня именно 16 бит int.
вот с наложением маски и побитовым И не получается, пример кода напишите, пожалуйста
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:23:44
Аlex
Через указатель.
Как-то примерно так:
Код: Выделить всё
#define BYTE_0(v) *((unsigned char*)&v+0)
#define BYTE_1(v) *((unsigned char*)&v+1)
Написал быстро от руки, возможно что-то не так, но смысл думаю понятен.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:28:44
phenomen
Думаю, этот код не для начинающего.
Вот проще, без указателей и адресов:
Код: Выделить всё
#define BYTE_X(v,x) (unsigned char)(v >> x*8 & 0xFF)
x*8 - на сколько бит сдвигаем (байт = 8 бит)
v >> x*8 - сдвигаем нужный байт в младший
v >> x*8
& 0xFF - накладываем маску
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:32:41
AaNnDdRrEeYy
через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
мне ее сохранить желательно.
я пока вот что методом тыка натыкал
Код: Выделить всё
int myvar_int =0b0100000010000010;
unsigned char f1 = myvar_int;
unsigned char f2 = myvar_int>>8;
//получается
f1 == 0b10000010
f2 == 0b01000000
вот как теперь f1 и f2 вместе собрать, обратно в int?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:34:52
phenomen
С помощью битового ИЛИ (операция | )и сдвигом влево старшего байта (<<)
Попробуйте сами.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:38:12
Аlex
AaNnDdRrEeYy писал(а):через указатель сама память которую у меня переменная int занимает будет разбита пополам, так?
Ничего нигде не будет разбиваться. Просто компилятор будет обращаться как к однобайтовым переменным по нужным адресам.
AaNnDdRrEeYy писал(а):вот как теперь f1 и f2 вместе собрать, обратно в int?
Через тот-же указатель:
Зы: вообще, правильнее это всё делать через union.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:40:22
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;
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:45:26
ploop
Тогда уж так:
Код: Выделить всё
unsigned char f1 = (unsigned char)myvar_int;
unsigned char f2 = (unsigned char)(myvar_int>>8)
Но лучше освойте указатели.
Кстати, в первом случае компилятор просто обратится к младшему байту, во втором может впендюрить цикл из 8 LSR/ROL в зависимости от настроек оптимизации.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:55:29
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
но с другой стороны, оперативки меньше на два байта расходуется, покрайней мере хочется в это верить.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 12:59:02
ploop
можно через переменную char изменить переменную int
Так а вы это... попробуйте не менять

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:10:04
А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
*/
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:13:58
Аlex
AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ?

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:20:29
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);
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:22:14
Аlex
ну и места жрет
Ровно столько, сколько Вы используете.
my_int_var у Вас занимает 2 байта.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:23:29
AaNnDdRrEeYy
Аlex писал(а):AaNnDdRrEeYy писал(а):через указатели эффект другой получается, можно через переменную char изменить переменную int
Всё тоже самое, что и без указателей. Вы запутались, т.к. видимо сами не понимаете что хотите.
Вы изменили одну из двух переменных, потом слили их в кучу и хотите, что-бы эта куча не изменилась. Как это так ?

да запутался, только сейчас сообразил.
сливать их в кучу не надо достаточно изменить одну переменную и значение в переменной int тоже поменяется.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт сен 27, 2013 13:25:13
Аlex
AaNnDdRrEeYy писал(а):достаточно изменить одну переменную и значение в переменной int тоже поменяется.
Это касается только
union. В остальных вариантах такое не будет происходить, т.к. у каждой переменной своя область памяти. А у
union она одна !
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 03, 2013 13:58:23
спящий
Добрый день,подскажите: делаю куб на сдвиговых регистрах, неправильно припаял ножки,чтобы непеределывать надо сделать функцию смещения бита, тоесть 256 бит сместить на 8192, а 512 на 16384:
Вот пример,который неполучился,изза сложения x|,потомучто при отсутствия всеравно выводит(если раньше было):
z=x|((x&256)<<5);
Короче подскажите функцию смещения одного бита из числа)
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 03, 2013 14:11:16
ploop
Короче подскажите функцию смещения одного бита из числа)
Ничё не понял.
Надо поменять местами 2 бита в числе?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 03, 2013 14:23:32
ibiza11
спящий, эко тебя понесло) Поток мыслей, но я ничего не понял)
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 03, 2013 15:02:28
Аlex