Всем доброго! Очередной вопрос от чайника к Гуру языка С. Как оптимально зеркально отразить биты в байте (скопировать(сдвинуть) в другой байт)? Например B00000001 -> B10000000 B00000011 -> B11000000 B00000101 -> B10100000 т.е. нужно чтобы 7 bit принял значение 0 bit 6 bit принял значение 1 bit и.т.д. цикл с побитовыми операциями я написать могу сам, может есть фишка более простая?
Либо я не понял чего-то, либо оператор ~ делает ровно то, что надо: Код (C++): byte b = 1; byte notB = ~b; // все биты поменяли своё значение не противоположное https://www.cprogramming.com/tutorial/bitwise_operators.html :
Код (C++): uint8_t mirror(uint8_t b) { uint8_t bm; bitWrite(bm,7, bitRead(b,0)); bitWrite(bm,6, bitRead(b,1)); bitWrite(bm,5, bitRead(b,2)); bitWrite(bm,4, bitRead(b,3)); bitWrite(bm,3, bitRead(b,4)); bitWrite(bm,2, bitRead(b,5)); bitWrite(bm,1, bitRead(b,6)); bitWrite(bm,0, bitRead(b,7)); return bm; } вот такая штука нужна - может её можно проще написать как то ))) ~ этот оператор просто инвертирует биты )))) вот для этого....
Как вариант (стырено в инетах, идея норм): Код (C++): unsigned char reverse(unsigned char b) { b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; b = (b & 0xCC) >> 2 | (b & 0x33) << 2; b = (b & 0xAA) >> 1 | (b & 0x55) << 1; return b; }
Идея с lookup-таблицей: Код (C++): static unsigned char lookup[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf, }; uint8_t reverse(uint8_t n) { // Reverse the top and bottom nibble then swap them. return (lookup[n&0b1111] << 4) | lookup[n>>4]; } Достаточно?
У меня так получилось: Код (C++): byte inv(byte a) { byte b = 0; for (byte i = 0; i < 8; i++) { b |= bool(a & (1 << (7 - i))) << i; } return b; }
почти то же самое, нагляднее Код (C++): byte ReverseByte(byte inbyte) { byte result = 0; for (byte i = 0; i < 8; i++) { result <<= 1; result |= bool(inbyte & 0x01); inbyte >>= 1; } return result; }
На ассемблере проще всего будет. В нём есть команды LSR r1 и ROL r2. Загрузив в r1 аргумент, после восьми пар таких сдвигов получим требуемый результат в r2.
Или в Excel =ДЕС.В.ШЕСТН(ЕСЛИ(БИТ.И(A1;1)=1;128)+ЕСЛИ(БИТ.И(A1;2)=2;64)+ЕСЛИ(БИТ.И(A1;4)=4;32)+ЕСЛИ(БИТ.И(A1;8)=8;16)+ЕСЛИ(БИТ.И(A1;16)=16;8)+ЕСЛИ(БИТ.И(A1;32)=32;4)+ЕСЛИ(БИТ.И(A1;64)=64;2)+ЕСЛИ(БИТ.И(A1;128)=128;1);2) Исходный байт в десятичном виде в ячейке A1
А как в excel сослаться на ячейку таблицы по имени столбца и строки? Например, есть таблица с названием ЗП в ней есть ячейка первого столбца с содержанием 1678, нужно обратиться к ячейке в той же строке, зная заголовок столбца и содержание ячейки первого ряда.
Если эта таблица в excel, то там все ячейки имеют столбцово-строчную адресацию. Зачем этот изврат через пользовательские заголовки столбца? Например, первая ячейка первой строки всегда A1, следующая за ней в этом ряду B1... Вопрос не в текущую тему и не понятен
Каков критерий оптимальности? Объём кода? Количество тактов процессора? Какой, кстати, процессор? Или нужно универсальное (для любого процессора) решение на ЯВУ?
я код для этой штуки на Arduino закончил писать 4 марта 2018г Весь этот Некропостинг тут для кого ? И причем тут Excel ? Там использовался готовый набор шрифтов стыренный из какого-то проекта, биты в байтах этого набора шрифтов лежали не в том порядке в котором нужно было выводить на POV дисплей... вроде что-то из того что предложили на форуме и использовал.
Прошу прощения, не заметил дат. Не знаю, мне показалось, что Вам интересно Но, похоже, ошибся, извините ещё раз.
Да я не обижаюсь - просто примеров уже накидали, честно скажу чем воспользовался - даже не помню.....