Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
#1

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

24.04.2014, 11:03. Просмотров 2589. Ответов 20
Метки нет (Все метки)

Объясните дураку работу с битовыми операциями...
Есть у меня массив, где первый элемент это 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.
Что не так? И как получить младшую часть? Раньше никогда с битовыми операциями дела не имел.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 11:03
Ответы с готовыми решениями:

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ...
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать...

Ввести число в битовой форме: 8 бит, старшие биты слева, младшие – справа
Код работает, но что-то неправильно считает. Не могу понять почему. Подскажите...

Как обнулить первые 4-е бита начиная с певого заряженного (первые - старшие биты)
Собственно, вопрос в заголовке.

Как получить биты переменной?
Есть ли какие-то встроенные средства, с помощью которых можно определить какие...

Написать функцию, меняющую в переменной типа char местами биты с номерами n и n+1
Написать функцию, меняющую в переменной типа char местами биты с номерами n и...

20
Kuzia domovenok
2261 / 2030 / 459
Регистрация: 25.03.2012
Сообщений: 7,173
Записей в блоге: 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];
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
24.04.2014, 11:27 #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Сразу вопрос: 64хбитное ли у тебя приложение строится?
а причем тут это?
некоторые компиляторы поддерживают long long, также такой тип появился в с++11
Цитата Сообщение от nullpointer Посмотреть сообщение
Объясните дураку работу с битовыми операциями...
зачем они тут?
C++
1
long long var = *(static_cast<long long*>(sp));
вроде так получится
0
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.

Ближе к делу, приведи весь код, с операциями, которые ты пытаешься произвести и напиши, какой результат в итоге ты хотел бы получить.
0
Kuzia domovenok
2261 / 2030 / 459
Регистрация: 25.03.2012
Сообщений: 7,173
Записей в блоге: 1
24.04.2014, 11:44 #5
Цитата Сообщение от aLarman Посмотреть сообщение
а причем тут это?
некоторые компиляторы поддерживают long long, также такой тип появился в с++11
при том, что у автора не "некоторый" компилятор, а 100% поддерживающий long long.
Далее, судя по тому, что автор использует long long для хранения своего числа, я предполагаю, что он предварительно проверил, что sizeof(long long) равен 8
0
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
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].
0
newbie666
Заблокирован
24.04.2014, 12:12 #7
я ж тебе сказал, код покажи со своими операциями, там же всё элементарно
0
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
24.04.2014, 12:15  [ТС] #8
newbie666, чуть позже выложу, код на другой машине просто.
0
aLarman
24.04.2014, 12:17
  #9

Не по теме:

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

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

Не по теме:

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

0
newbie666
Заблокирован
24.04.2014, 12:32 #12
ТС, ты можешь в двух словах сказать, что ты конкретно хочешь сделать?
ну вот есть у тебя unsigned int sp[2] = {0x11111111, 0x22222222};
дальше что? составишь ты 8-и битную переменную, дальше ты к ней что то прибавишь или умножишь её на что то? потом разделить хочешь обратно?
0
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
24.04.2014, 12:59  [ТС] #13
newbie666, да, именно! Собрать в 8 байтную переменную, сложить ее с другой, результат разделить обратно.
0
newbie666
Заблокирован
24.04.2014, 13:26 #14
Лучший ответ Сообщение было отмечено nullpointer как решение

Решение

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;
1
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
24.04.2014, 13:36  [ТС] #15
newbie666, почему-то результат
C++
1
2
one = sp[0];    
one = (one << 32) | sp[1];
равен sp[1]. Это так и должно быть?
0
Kuzia domovenok
2261 / 2030 / 459
Регистрация: 25.03.2012
Сообщений: 7,173
Записей в блоге: 1
24.04.2014, 13:43 #16
Цитата Сообщение от nullpointer Посмотреть сообщение
равен sp[1]. Это так и должно быть?
это будет в случае sizeof(one) = 8 то есть, если у тебя нет никаких 64хбитных переменных.
Я ещё раз тебя прошу, выведи на экран:
sizeof(sp[0])
sizeof(var)
sizeof(one )
sizeof(чего у тебя там ещё за переменные есть...)
и покажи нам! достало уже вторую страницу гадать, что там у тебя происходит!
0
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
24.04.2014, 13:52  [ТС] #17
Вот вывожу размеры переменных:
sp[0] - младшая часть синхропосылки
var - переменная в которую объединяю sp[0] и sp[1]
ctr - счетчик, с которым складываю var
Разделить старшие и младшие биты в переменной
0
newbie666
Заблокирован
24.04.2014, 14:15 #18
Цитата Сообщение от nullpointer Посмотреть сообщение
равен sp[1]. Это так и должно быть?
кто тебе сказал? Нет - после этого старшие байты должны встать на старшие места и младшие на младшие
0
nullpointer
46 / 46 / 14
Регистрация: 30.03.2009
Сообщений: 523
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].
0
newbie666
Заблокирован
24.04.2014, 14:44 #20
Цитата Сообщение от nullpointer Посмотреть сообщение
и он вывел значение равное sp[1].
конечно ёлки палки, у тебя ж 8-и байтовая переменная. На будущее, всегда дебаггером смотри, а не какими то принт эфами как нубарь
Так проверь: printf("%llu",one);
0
24.04.2014, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 14:44

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты...

Вывести старшие цифры двузначных чисел
На вход в первой строке подаётся натуральное число N (не более 100). Далее, во...

Возвратить число, в котором переставлены две младшие цифры
Возвратить число, в котором переставлены две младшие цифры. Помогите,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru