Страница 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?
Через тот-же указатель:

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

myvar_int = *(unsisned int*)&f1;
Зы: вообще, правильнее это всё делать через 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 = myvar_int;
Тогда уж так:

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

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
:))) :))) :)))