Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 02.11.2010
Сообщений: 38
1

Как обратиться к последним двум битам числа из блока

10.06.2012, 13:03. Показов 1331. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеются две функции, первая извлекает два последних бита из каждого байта, полученного из строки (Строка- Байты- Два последних бита) и, собственно, обратная.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 public static int[] StrToBit(string m)
        {            
            byte[] q = Encoding.Unicode.GetBytes(m);
 
            int[] b = new int[q.Length * 2];
 
            for (int i = 0; i < q.Length; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    b[i] = (q[i] >> j) & 1;
                    // f.ex 01001101 >> 2 == 00010011 & 00000001 == 00000001
                }
            }
 
            return b;
        }
        public static string BitToStr(int[] b)
        {
            byte[] q = new byte[b.Length];
            for (int i = 0; i < b.Length; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    q[i] |= Convert.ToByte(b[i] << j);
                }
            }
            string m = Encoding.Unicode.GetString(q);
            return m;
        }
Ещё имеется функция, которая после дкп преобразований записывала бы эти два последние бита в блок 8х8. Вот с ней у меня проблема, не могу понять, как обратиться к последним двум битам числа из блока.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  public static void Write(Block wr, int v1, int v2)
        {
            double w1 = wr.arr[4, 5], w2 = wr.arr[5, 4];       // позиции ДКП- коэффицентов, которые будут использоваться при встраивании/ извлечении сообщения
            double P = 25;                                     // порог, для сравнения результатов разности модулей коэффицентов
 
            byte[] tmp = new byte[2] { Convert.ToByte(v1), Convert.ToByte(v2) };
            if ((Math.Abs(v1) - Math.Abs(v2)) < -P)
            {
                // передача единичного бита
              
                
                // как обратиться к последним двум битам ??????__ у параметров w1 и w2 (val1 и val2 - биты )
            }
            else if ((Math.Abs(v1) - Math.Abs(v2)) > P)
            {
                // передача нулевого бита
            
            }
 
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2012, 13:03
Ответы с готовыми решениями:

Дан код символа; как обратиться через битовый сдвиг к его 678 битам
дан код символа как обратиться через битовый сдвиг к его 678 битам, потом к 345 и потом к 12...

Равна ли сумма первых двух цифр пятизначного числа, двум последним?
Равна ли сумма первых двух цифр пятизначного числа, двум последним?

Проверка по битам числа
Надо сделать проверку числа к примеру 0F по битам, если в бите 0 то переход по следующему адрес....

Разбиение числа по битам
Всем привет! Есть int - число, его нужно разбить в четыре char - переменных. Как это сделать?

4
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
10.06.2012, 15:57 2
C#
1
2
3
byte firstBit = v1 & 1;
byte secondBit = v1 & 2;
byte lastTwoBits = v1 & 3;
0
0 / 0 / 1
Регистрация: 02.11.2010
Сообщений: 38
10.06.2012, 16:08  [ТС] 3
можно пояснение к тому, что тут происходит? и почему &, а не |
0
27 / 27 / 4
Регистрация: 29.01.2012
Сообщений: 160
10.06.2012, 18:03 4
& - побитовое умножение. т.е будут перемножены все биты 2-х чисел

Допустим нужно значение первого бита числа 10101101
10101101 умножаем побитово на 1 (т.е 00000001)
при умножение на 1 обнуляются все биты кроме 1

10101101
&
00000001
получаем 1 (как видно первый бит и равен 1). Т.е мы получили то что надо
0
0 / 0 / 1
Регистрация: 02.11.2010
Сообщений: 38
11.06.2012, 06:58  [ТС] 5
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
2
3
byte firstBit = v1 & 1;
byte secondBit = v1 & 2;
byte lastTwoBits = v1 & 3;
Тут либо я Вас не правильно понимаю, либо меня неправильно поняли.
Я хочу обратиться к последним двум битам значений w1 и w2, а v1 и v2 - последние биты символов из строки, то есть например моё w1 выглядит вот так
1010101_0
я проверяю условие, и если оно выполняется, то должно получиться следующее
1010101_v1
либо _v2
в зависимости от условия.
0
11.06.2012, 06:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2012, 06:58
Помогаю со студенческими работами здесь

Найти слова по последним двум буквам
Всем привет, вот такая проблема ИТКН ИТГН ИТОН ИТШО СОСТКН ЛОЛШГ ЛОКН ИОСРКГ СЛТКН

Можно ли обратиться сразу к двум таблицам?
У меня есть таблица 'X' в бд из нее выводится информация только по определенному 'id'. Этот 'id'...

Отображение первого блока - последним
Доброй ночи, очень прошу помочь! Есть блок(main) который в коде идет самый...

Обратиться к соседнему элементу блока
Добрый вечер. столкнулся с проблемой &lt;ul class=&quot;service_menu_ul&quot;&gt; &lt;li&gt; &lt;a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru