Получить адрес байта и бита

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Никак не соображу как это сделать

У меня есть 128 "флагов", это 16 байт информации.

WriteBits(31);

void WriteBits(byte  adres) {
byte NomByte= adres/8;
Serial.print("Byte=");
Serial.print(NomByte);
Serial.println("");
Serial.print("Bits=");
}

Я обращаюсь к флагу 22 - это 2 байт 6 бит.

Байт получила, это 22/8=целое число 2

А бит раасчитать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну так вычесть из 22 два раза по 8.

Т.е. частное от деления на 8 - это номер байта, а остаток - номер бита.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Это понятно.

22/8=2.75 (2 это байт, 7-1=6 - это бит)

31/8=3.875 (2 это байт, 8-1=7 - это бит)

Это надо float преобразовать в char и распарсить символы до точки и первый символ после точки

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Зачем? Есть же «%» (он же - остаток от деления). 22 / 8 = 2; а потом 22 % 8 = 6. Все. :-) (соответственно в целых числах). 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Irinka пишет:

Это понятно.

22/8=2.75 (2 это байт, 7-1=6 - это бит)

31/8=3.875 (2 это байт, 8-1=7 - это бит)

А вот мне совершенно непонятно.

Но, в любом случае, делить надо нацело.

Цитата:

Это надо float преобразовать в char и распарсить символы до точки и первый символ после точки

Если нужно текстовое представление числа до одного знака после запятой, не нужно никакого float: сначала умножаешь на 10, потом вычисляешь цифры как положено, через частное и остаток. Ну а перед последней цифрой добавляешь точку.

В общем, я совсем запутался. Что нужно в результате?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

BOOM пишет:

Зачем? Есть же «%» (он же - остаток от деления). 22 / 8 = 2; а потом 22 % 8 = 6. Все. :-) (соответственно в целых числах). 

Спасибо.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

У всех битов в байте одни и тот же адрес, поскольку в восьмиразрядных системах мы адресуемся к байту. Бит - часть байта, одна восьмая часть. У бита есть только положение в байте, нулевой, первый, второй.... седьмой. Стандартные логические переменные (булевы) в си представлены байтом. Поэтому не стоит путать bit и bool.  

К чему это я..... зачем.... Ну пусть будет.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А где о bool было? Я что-то не понял к чему это...

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

BOOM пишет:

А где о bool было? Я что-то не понял к чему это...

Я ж и сам не понял... Просто частенько люди считают что в си bool=бит, поскольку bool имеет только два состояния.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Экономно было бы, да не так это. )))

Поэтому я предпочитаю вместо bool -> byte. Больше ста вариантов, а не два )))

nik182
Offline
Зарегистрирован: 04.05.2015

brokly пишет:

BOOM пишет:

А где о bool было? Я что-то не понял к чему это...

Я ж и сам не понял... Просто частенько люди считают что в си bool=бит, поскольку bool имеет только два состояния.


Состояния то два, в вот переменная под bool имеет 255 как минимум состояний.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

nik182 пишет:
как минимум

Хорошее уточнение) Еще можно сказать "более 255 состояний")))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я бы попросил.... состояний два, а значений 256.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Irinka пишет:

31/8=3.875 (2 это байт, 8-1=7 - это бит)

3.875 (2 это байт ... это как так вышло ???

sadman41
Offline
Зарегистрирован: 19.10.2016

Komandir пишет:

Irinka пишет:

31/8=3.875 (2 это байт, 8-1=7 - это бит)

3.875 (2 это байт ... это как так вышло ???

Полтора землекопа... )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Komandir пишет:

Irinka пишет:

31/8=3.875 (2 это байт, 8-1=7 - это бит)

3.875 (2 это байт ... это как так вышло ???

Полтора землекопа... )))

почему землекопа? помнится в отчетах охотхозяйства фигурировало, что ими убито 3.75 волка и 2.17 лисицы )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

sadman41 пишет:

Komandir пишет:

Irinka пишет:

31/8=3.875 (2 это байт, 8-1=7 - это бит)

3.875 (2 это байт ... это как так вышло ???

Полтора землекопа... )))

почему землекопа?

https://youtu.be/ICqPUwOGnxw

Это мультик нашего детства "В стране невыученных уроков". Ты не шпиён мериканский, засланный к нам ;)))) Ежели наши родные "калчерал референсес" не понимаешь?

nik182
Offline
Зарегистрирован: 04.05.2015

brokly пишет:

Я бы попросил.... состояний два, а значений 256.

состояний два. Ноль это false, ocтальные 255 - true. У true 255
, а false однозначно определён.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Komandir пишет:

Irinka пишет:

31/8=3.875 (2 это байт, 8-1=7 - это бит)

3.875 (2 это байт ... это как так вышло ???

Решили вопрос уже, зачем не в отвлечённых такой флейм?! Модераторы тут есть вообще? Или что?

Green
Offline
Зарегистрирован: 01.10.2015

nik182 пишет:
brokly пишет:

Я бы попросил.... состояний два, а значений 256.

состояний два. Ноль это false, ocтальные 255 - true. У true 255 , а false однозначно определён.

Да ну? Никаких 255 - только 1. (Хорошо бы... пива. Нет, только вино.)

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да, если объявлен как bool, то только 0 и 1 . А если как байт? Его тоже можно использовать в конструкции if ( byte ) ...  И даже сработает. Это я в приложении к тому, что бы биты использовать. 

Green
Offline
Зарегистрирован: 01.10.2015

Но начали то за bool.) А если byte вместо bool, то это уже быдлокодерство, либо хацкерство.)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Ну да, если объявлен как bool, то только 0 и 1 .

Отнюдь.

В Си bool относится к целочисленным типам, соответственно, может принимать не менее 256 значений (в зависимости от реализации может также 65536 или 4294967296 значений).

Green
Offline
Зарегистрирован: 01.10.2015

Отнюдь. В Си нет встроенного типа bool. В С99 только подключается через stdbool.h. Но мы то и не о Си вовсе.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

В Си bool относится к целочисленным типам, соответственно, может принимать не менее 256 значений (в зависимости от реализации может также 65536 или 4294967296 значений).

Это ты с Виндовым LONGBOOL путаешь, в стандартном Си от кернигана bool == int

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

andriano пишет:

В Си bool относится к целочисленным типам, соответственно, может принимать не менее 256 значений (в зависимости от реализации может также 65536 или 4294967296 значений).

Это ты с Виндовым LONGBOOL путаешь, в стандартном Си от кернигана bool == int

А int как раз от 65536 до 4294967296 в зависимости от реализации. Что не так?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

Что не так?

В Си int не зависит от платформы и везде 16-ти битный. И не 65536 у него максимум, а 32767

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

andriano пишет:

Что не так?

В Си int не зависит от платформы и везде 16-ти битный. И не 65536 у него максимум, а 32767

1. Откомпилируй для Arduino Due "Serial.println(sizeof(int));" и узнай размер int в байтах. В биты, надеюсь, сам переведешь.

2. Речь не о "максимум", а о количестве значений. Для 16-разрядного int это будет от -32768 до 32767 - ровнехонько 65536 значений. Для 32-разрядного int (когда обнаружишь, что таковые в природе встречаются) - посчитаешь сам.

 

PS. По K&R  (стр.16) "Точность как INT, TAK и FLOAT зависит от конкретной машины".

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да, ты прав, невнимательно я читал Кернигана с Ритчи. 

Logik
Offline
Зарегистрирован: 05.08.2014

Это проще понимать так. Int - самый удобный для процессора, т.е. его розрядность, но не 8 а больше. Bool - просто  его розрядность.

Green
Offline
Зарегистрирован: 01.10.2015

Относительно bool. Наткнулся я на https://server.179.ru/tasks/cpp/total/ - уроки по С/С++. И что ж мы там читаем:

Цитата:
Логический тип в C++

В языке С++ для логических значений существует специальный тип -- bool.
Допустимыми значениями этого типа являются только true и false, при этом других значений у переменной данного типа быть не может.
 
Переменная типа bool занимает в памяти ровно 1 байт.
bool b;
cout << sizeof(b); //выведет 1
Ну да, всё красиво. А дальше:
 
Допустимые операции
С логическими переменными можно осуществлять логические операции:
~x -- логическое отрицание (НЕ)
x & y -- логическое умножение (И)
x | y -- логические сложение (ИЛИ)
Для типа bool стираются различия между операторами && и &, а также между || и |.
 
Ужос! "Никому нельзя верить."(
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

В Си bool относится к целочисленным типам, соответственно, может принимать не менее 256 значений (в зависимости от реализации может также 65536 или 4294967296 значений).

Не может. Разве что Вы его туда через union запихаете, но это уже "залезание под юбку" и "undefined behavior" (мы это недавно обсуждали). А так если использовать _Bool, то при любой операции (присваивание целого, например), всё будет преобразовано к 0 и 1. Кстати, там есть забавная ремарка: "While the number of bits in a _Bool object is at least CHAR_BIT, the width (number of sign and value bits) of a _Bool can be just 1 bit".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Отнюдь. В Си нет встроенного типа bool. В С99 ...

В более поздних появился _Bool - это честное ключевое слово и честный тип.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

уроки по С/С++. И что ж мы там читаем:

Цитата:
Переменная типа bool занимает в памяти ровно 1 байт.

Верно, но лишь до тех пор, пока мы с нею правильно обращаемся. Если начинать "лезть под юбку", то можно и нарваться на: "Using a bool value in ways described by this document as “undefined”, such as by examining the value of an uninitialized automatic object, might cause it to behave as if it is neither true nor false" (стр. 92 по файлу)

Green пишет:

уроки по С/С++. И что ж мы там читаем:

Цитата:
Переменная типа bool занимает в памяти ровно 1 байт.

Брехня. Более того, в стандарте есть специальная ремарка: "sizeof(bool) is not required to be 1" (стр. 133 по файлу)

Так что, действительно

Green пишет:
Ужос! "Никому нельзя верить."(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ужос! "Никому нельзя верить."(

главное, чтобы об этом жена не узнала )))

lilik
Offline
Зарегистрирован: 19.10.2017

А почему нельзя сделать пакет на 8 битных переменных и пихать в память? Ну что бы 1 переменная - 1 байт, а 8 опять 1 байт.

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:
Если начинать "лезть под юбку", то можно и нарваться на: "Using a bool value in ways described by this document as “undefined”, such as by examining the value of an uninitialized automatic object, might cause it to behave as if it is neither true nor false" (стр. 92 по файлу)

Да, об этом в курсе. Но меня больше удивляет по ссылке, якобы то, что битовые операции с bool равносильны логическим, а особенно ~.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lilik пишет:

А почему нельзя сделать пакет на 8 битных переменных и пихать в память? Ну что бы 1 переменная - 1 байт, а 8 опять 1 байт.

Наверное, потому, что Клапауций запретил. А так (пока он не видит) можно и даже тема с готовым кодом была.

lilik
Offline
Зарегистрирован: 19.10.2017

А как тему эту на форуме отыскать?, через месяц свою откопать трудно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, например - http://arduino.ru/forum/programmirovanie/sizeofbool#comment-462101 здесь как сделать массив bool'ов, чтобы он лишнего места не жрал.

Хотя было ещё штук пять как минимум, поиском попробуйте.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Ну, например - http://arduino.ru/forum/programmirovanie/sizeofbool#comment-462101 здесь как сделать массив bool'ов, чтобы он лишнего места не жрал.

Хотя было ещё штук пять как минимум, поиском попробуйте.

Женя! А у тебя нет примера написанного класса "бит аррей" с переопределенным присваиванием, индексом и классом-хелпером? Просто чтобы показать народу. Мне наверно часок потребуется, чтобы написать. Начал было, но подумал, что кто-то уже наверняка писал подобное и не раз.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Сорри. уже увидел!