Форум программистов, компьютерный форум CyberForum.ru

Разделить старшие и младшие биты в переменной - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 11:03     Разделить старшие и младшие биты в переменной #1
Объясните дураку работу с битовыми операциями...
Есть у меня массив, где первый элемент это 32 младших бита, а второй - 32 старших
C++
1
unsigned int sp[2] = {0x11111111, 0x22222222};
Теперь мне это нужно записать в переменную, делаю вот так
C++
1
long long var = (sp[0] << 32) | (sp[1] << 32);
Далее провожу операции над этой переменной, а затем мне заново нужно разделить старшие и младшие биты. Пытаюсь сделать так (для старшей части)
C++
1
sp[1] = (var >> 32);
В итоге на выводе получаю 0.
Что не так? И как получить младшую часть? Раньше никогда с битовыми операциями дела не имел.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 11:03     Разделить старшие и младшие биты в переменной
Посмотрите здесь:

Перенести ведущие нули десятичного представления в младшие разряды C++
... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... C++
Как обнулить первые 4-е бита начиная с певого заряженного (первые - старшие биты) C++
C++ Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...)
Возвратить число, в котором переставлены две младшие цифры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 11:22     Разделить старшие и младшие биты в переменной #2
Сразу вопрос: 64хбитное ли у тебя приложение строится?
во-вторых, зачем sp[0] сдвигается? это же младшая часть, так?
Ну так и оставь её младшей: long long var = (sp[0]) | (sp[1] << 32); !
Возможно ещё, что операции | и << производятся с 32х битными числами. Тогда все результаты надо приводить к типу long long
long long var = (sp[1]);
var = (var<<32)|sp[0];
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.04.2014, 11:27     Разделить старшие и младшие биты в переменной #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Сразу вопрос: 64хбитное ли у тебя приложение строится?
а причем тут это?
некоторые компиляторы поддерживают long long, также такой тип появился в с++11
Цитата Сообщение от nullpointer Посмотреть сообщение
Объясните дураку работу с битовыми операциями...
зачем они тут?
C++
1
long long var = *(static_cast<long long*>(sp));
вроде так получится
newbie666
Заблокирован
24.04.2014, 11:28     Разделить старшие и младшие биты в переменной #4
Цитата Сообщение от nullpointer Посмотреть сообщение
Есть у меня массив, где первый элемент это 32 младших бита, а второй - 32 старших
так, давай по порядку, какие операции тебе надо производить над твоей переменной? Для того, чтоб производить операции, тебе её надо правильно составить. Есть least significant bit (LSB) и most significant bit (MSB), про это не надо забывать. В общем смари, ты пишешь, у меня есть 4 бйта старших и 4 байта младших битов, ты уверен что правильно понимаешь что ты пишешь? Ведь в 8-и байтовой переменной, есть старшее двойное слово, в старшем двойном слове есть старшее слово, а в старшем слове есть старший байт ... Как бы тебе сказать, нужно чётко понимать значения слов Big Endian и Little Endian.

Ближе к делу, приведи весь код, с операциями, которые ты пытаешься произвести и напиши, какой результат в итоге ты хотел бы получить.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 11:44     Разделить старшие и младшие биты в переменной #5
Цитата Сообщение от aLarman Посмотреть сообщение
а причем тут это?
некоторые компиляторы поддерживают long long, также такой тип появился в с++11
при том, что у автора не "некоторый" компилятор, а 100% поддерживающий long long.
Далее, судя по тому, что автор использует long long для хранения своего числа, я предполагаю, что он предварительно проверил, что sizeof(long long) равен 8
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 12:05  [ТС]     Разделить старшие и младшие биты в переменной #6
В общем-то пытаюсь реализовать ГОСТ 28147-89 в режиме счетчика (CTR). Синхропосылка 64-бита, 32 младших разряда надо записать в N[0], 32 старших в N[1], т.е. у меня получается
C++
1
2
N[0] = sp[0];
N[1] = sp[1];
Далее все по ГОСТу идет в режиме гаммирования. Чтобы реализовать CTR синхропосылку xor'ом складываю со счетчиком, вот для этого я и пытаюсь собрать массив sp в единое целое, а затем мне надо опять получившуюся переменную после xor'а разделить на старшую и младшую часть и записать соответственно в N[1] и N[0].
newbie666
Заблокирован
24.04.2014, 12:12     Разделить старшие и младшие биты в переменной #7
я ж тебе сказал, код покажи со своими операциями, там же всё элементарно
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 12:15  [ТС]     Разделить старшие и младшие биты в переменной #8
newbie666, чуть позже выложу, код на другой машине просто.
aLarman
24.04.2014, 12:17
  #9

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я предполагаю, что он предварительно проверил
это всего лишь предположение
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
при том, что у автора не "некоторый" компилятор, а 100% поддерживающий long long.
так и не увидел ответа на свой вопрос
Цитата Сообщение от aLarman Посмотреть сообщение
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Сразу вопрос: 64хбитное ли у тебя приложение строится?
а причем тут это?

nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 12:20  [ТС]     Разделить старшие и младшие биты в переменной #10
aLarman, перед использованием long long я действительно проверил, занимает ли он 8 байт
aLarman
24.04.2014, 12:31
  #11

Не по теме:

nullpointer, еще раз повторюсь, не вижу связи с 64битностью собираемого приложения

newbie666
Заблокирован
24.04.2014, 12:32     Разделить старшие и младшие биты в переменной #12
ТС, ты можешь в двух словах сказать, что ты конкретно хочешь сделать?
ну вот есть у тебя unsigned int sp[2] = {0x11111111, 0x22222222};
дальше что? составишь ты 8-и битную переменную, дальше ты к ней что то прибавишь или умножишь её на что то? потом разделить хочешь обратно?
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 12:59  [ТС]     Разделить старшие и младшие биты в переменной #13
newbie666, да, именно! Собрать в 8 байтную переменную, сложить ее с другой, результат разделить обратно.
newbie666
Заблокирован
24.04.2014, 13:26     Разделить старшие и младшие биты в переменной #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned int sp[2] = {0x11111111, 0x22222222};
 
long long unsigned int one = 0;
one = sp[0];    
one = (one << 32) | sp[1];
 
long long unsigned int two = 345834584;
one += two;
 
unsigned result_HI_DWORD, result_LO_DWORD;
result_HI_DWORD = one >> 32;
result_LO_DWORD = one << 32 >> 32;
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 13:36  [ТС]     Разделить старшие и младшие биты в переменной #15
newbie666, почему-то результат
C++
1
2
one = sp[0];    
one = (one << 32) | sp[1];
равен sp[1]. Это так и должно быть?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 13:43     Разделить старшие и младшие биты в переменной #16
Цитата Сообщение от nullpointer Посмотреть сообщение
равен sp[1]. Это так и должно быть?
это будет в случае sizeof(one) = 8 то есть, если у тебя нет никаких 64хбитных переменных.
Я ещё раз тебя прошу, выведи на экран:
sizeof(sp[0])
sizeof(var)
sizeof(one )
sizeof(чего у тебя там ещё за переменные есть...)
и покажи нам! достало уже вторую страницу гадать, что там у тебя происходит!
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 13:52  [ТС]     Разделить старшие и младшие биты в переменной #17
Вот вывожу размеры переменных:
sp[0] - младшая часть синхропосылки
var - переменная в которую объединяю sp[0] и sp[1]
ctr - счетчик, с которым складываю var
Разделить старшие и младшие биты в переменной
newbie666
Заблокирован
24.04.2014, 14:15     Разделить старшие и младшие биты в переменной #18
Цитата Сообщение от nullpointer Посмотреть сообщение
равен sp[1]. Это так и должно быть?
кто тебе сказал? Нет - после этого старшие байты должны встать на старшие места и младшие на младшие
nullpointer
 Аватар для nullpointer
45 / 45 / 5
Регистрация: 30.03.2009
Сообщений: 518
24.04.2014, 14:20  [ТС]     Разделить старшие и младшие биты в переменной #19
newbie666, так вот я и говорю, что после выполнения данного участка кода вывел значение one
C++
1
2
3
one=sp[0];
one=(one<<32)|sp[1];
printf("%u",one);
и он вывел значение равное sp[1].
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 14:44     Разделить старшие и младшие биты в переменной
Еще ссылки по теме:

Написать функцию, меняющую в переменной типа char местами биты с номерами n и n+1 C++
Возвратить число, в котором переставлены две младшие цифры C++
C++ Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат

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

Или воспользуйтесь поиском по форуму:
newbie666
Заблокирован
24.04.2014, 14:44     Разделить старшие и младшие биты в переменной #20
Цитата Сообщение от nullpointer Посмотреть сообщение
и он вывел значение равное sp[1].
конечно ёлки палки, у тебя ж 8-и байтовая переменная. На будущее, всегда дебаггером смотри, а не какими то принт эфами как нубарь
Так проверь: printf("%llu",one);
Yandex
Объявления
24.04.2014, 14:44     Разделить старшие и младшие биты в переменной
Ответ Создать тему
Опции темы

Текущее время: 05:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru