Побитовые сдвиги.

Здесь обсуждаем Arduino
Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Побитовые сдвиги.

Сообщение GhostX » 21 янв 2016, 18:32

Изображение Долбанные побитовые сдвиги. Научился их считать, но так и не понял их.!!! Изображение
Есть кусок кода:

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

#include <EEPROM.h> //Needed to access the eeprom read write functions

//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void EEPROMWriteInt(int p_address, int p_value)
        {
        byte lowByte = ((p_value >> 0) & 0xFF);
        byte highByte = ((p_value >> 8) & 0xFF);

        EEPROM.write(p_address, lowByte);
        EEPROM.write(p_address + 1, highByte);
        }

//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int EEPROMReadInt(int p_address)
        {
        byte lowByte = EEPROM.read(p_address);
        byte highByte = EEPROM.read(p_address + 1);

        return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
        }

void setup()
        {
        Serial.begin(9600);

        EEPROMWriteInt(0, 0xABCD);

        Serial.print(\"Read the following int at the eeprom address 0: \");
        Serial.println(EEPROMReadInt(0), HEX);
        }

void loop()
        {
        }
Вроде простой. Читает и записывает в память eeprom ардуины. Загоняем с нулевого ардеса значение 0xABCD,
А потом читаем значение с нулевого адреса и выводим на печать в сериал порт. Все просто.
так как в 1 байт, это значение ни как не лезет, значение переменной в коде делится на 1 байт младший и один старший. И с этого места начинается все самое интересное.
Вот тут:

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

         byte lowByte = ((p_value >> 0) & 0xFF);
         byte highByte = ((p_value >> 8) & 0xFF);
Старший и младший байт приобретают свои значения, для последующего назначения им адреса. Очень хорошо представляю двоичную структуру. Но что тут происходит байтами? зачем сдвиг на 0, что он даст? Если второе смещение удаляет младшее значение, чтоб оставшиеся 8 бит записать в старший байт, то зачем первое? Что за 0xFF? Понимаю, как считается, не понимаю, что это дает и зачем. Это сложение же не чего не изменит...
____________________________________________________ Изображение

Аватара пользователя
gurvinok
Сообщения: 1491
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Побитовые сдвиги.

Сообщение gurvinok » 21 янв 2016, 21:15

:lol: :lol:
Тут я так понимаю необходимо киношку снять.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Побитовые сдвиги.

Сообщение GhostX » 21 янв 2016, 21:48

Изображение

Да, надо.

Изображение

Аватара пользователя
gurvinok
Сообщения: 1491
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Побитовые сдвиги.

Сообщение gurvinok » 21 янв 2016, 22:34

Завтра. Сегодня был день тяжелый и я пиво пью.
Если долго мучиться, может быть получится.

Аватара пользователя
gurvinok
Сообщения: 1491
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Побитовые сдвиги.

Сообщение gurvinok » 22 янв 2016, 22:23

А вот и кино.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Побитовые сдвиги.

Сообщение GhostX » 22 янв 2016, 23:39

КИНОШКА!!!!!!Изображение
Изображение

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Побитовые сдвиги.

Сообщение GhostX » 23 янв 2016, 00:53

На половину своего вопроса получил более чем исчерпывающий ответ.)) Киношка отличная!
до половины сидел зевал :) , так как базу логики знаю, а вот потом началось очень интересно.
Изображение

И так снова вопрос.))
Зачем сдвигать на 0???

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

byte lowByte = ((p_value >> 0) & 0xFF);

Аватара пользователя
gurvinok
Сообщения: 1491
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Побитовые сдвиги.

Сообщение gurvinok » 23 янв 2016, 15:29

Для симметрии.

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

#define PORT0 0
#define PORT1 1
#define PORT2 2
#define PORT3 3
#define PORT4 4
#define PORT5 5
#define PORT6 6
#define PORT7 7

PORT |= (1 << PORT0);  
PORT |= (1 << 0);
Выше написанное одно и тоже.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Побитовые сдвиги.

Сообщение GhostX » 23 янв 2016, 15:52

Написанный код понятен, смысл не очень.
что дает эта симметрия?
Хотя я и не понял в чем эта симметрия...
Если 0хFF я очень четко понял для чего нужно, то сдвиг на 0
не продвинулся и на миллиметр.
...? :?

Аватара пользователя
gurvinok
Сообщения: 1491
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Побитовые сдвиги.

Сообщение gurvinok » 23 янв 2016, 16:02

Сдвиг на ноль.
В чем отличие 5+0 = 5 или 5 = 5.
Если долго мучиться, может быть получится.

Ответить