Перейти к содержимому

Фото
- - - - -

Вытащить биты из long С/С++


  • Вы не можете создать новую тему
  • Please log in to reply
7 ответов в этой теме

#1 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 22 Июль 2011 - 08:15

Вопрос.
Вот есть у меня переменная
double long ppp;
Пускай в двоичном коде она будет выглядеть как 00000000 00000000 00000000 00100010
Как мне передать значение вот этому массиву битов(т.е. что бы массив содержал все эти биты)
bool opp[31];
что бы я мог оперировать данными битами по отдельности.

Очень, очень надо...
Или альтернативное решение, как это можно сделать.

Сообщение изменено: ossesion (22 Июль 2011 - 08:23 )

  • 0

#2 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 502 сообщений
  • Откуда:Эстония, Таллин

Отправлено 22 Июль 2011 - 08:25

есть два пути - первый пройтись циклом сравнения по всем битам или применить библиотечную функцию.
Dim tmp_str As String = ""
        For cnt = 31 To 0 Step -1
            If (s_info And (1 << cnt)) <> 0 Then
                tmp_str = tmp_str + "1"
            Else
                tmp_str = tmp_str + "0"
            End If
        Next
Этот пример создает переменную типа строка, состоящую из нулей и единиц двоичного представления переменной типа лонг s_info. Пример на VB.NET - под С сам перекопмилируешь. В твоем случае надо просто создать массив example_bits(32) и заполнять его битами в блоке условия.

Сообщение изменено: Вырвиглаз (22 Июль 2011 - 08:25 )

  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#3 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 22 Июль 2011 - 08:29

ossesion, юзай маски ... XOR 1 для переключения битов AND 1 для проверки и дизьюнкцию для установки ...

http://ru.wikipedia....i/Битовая_маска

Подробнее здесь

http://ru.wikipedia....ki/Битовое_поле
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#4 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 22 Июль 2011 - 09:00

Инкуб,
омг =)) все оказалось на много проще, спасибо =-)))
  • 0

#5 AntiDote

AntiDote
  • Пользователь
  • 325 сообщений

Отправлено 22 Июль 2011 - 13:15

Вопрос.
Вот есть у меня переменная
double long ppp;
Пускай в двоичном коде она будет выглядеть как 00000000 00000000 00000000 00100010
Как мне передать значение вот этому массиву битов(т.е. что бы массив содержал все эти биты)
bool opp[31];
что бы я мог оперировать данными битами по отдельности.

Очень, очень надо...
Или альтернативное решение, как это можно сделать.

Всё в игрушки играешь??? :lol:
  • 0

#6 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 22 Июль 2011 - 13:53

AntiDote,

Всё в игрушки играешь???

Нет, визуализацию делаю для Блочной Обессоливающей Установки на ТЭЦ.
А ты все водку дешевую бухаешь?

Сообщение изменено: ossesion (22 Июль 2011 - 13:54 )

  • 0

#7 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 24 Август 2011 - 13:04

Для удобного хранения битов есть славный класс bitset. Вобщем-то это практически то же самое, что vector<bool>, где булевые значения упакованы в биты. Very handy indeed! Вот небольшой пример:

#include <stdlib.h>
#include <bitset>

const unsigned long x = 34; // Value to represent as binary
const unsigned int s = 32; // Bit count

int main()
{
bitset<s> b(x); // Create ur bitset from the desired value

for (int i=s; i > 0; i--) // Print this shit backwards
    printf("%d", (bool)b[i-1]);

return 0;
}

Выдаст: 00000000000000000000000000100010

Так же можно использовать комбинации bit fields и unions (типа упаковать биты в bit field и использовать его вместе с желаемым типом в union).

В догонку к инкубовским линкам:
http://www.cplusplus...nce/stl/bitset/
http://tdistler.com/...lds-effectively
  • 0

#8 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 27 Август 2011 - 19:59

если бы вы знали как простой совет с "маской" упростил задачу разработки визуализации.... :D :D :D :D Примерно как заместо лопаты, копать трактором...
  • 0