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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
nullpointer
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
#1

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

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

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

Ввести число в битовой форме: 8 бит, старшие биты слева, младшие – справа - C++
Код работает, но что-то неправильно считает. Не могу понять почему. Подскажите плз. /*Дано число типа unsigned char, то есть от 0 до...

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

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

Написать функцию, меняющую в переменной типа char местами биты с номерами n и n+1 - C++
Написать функцию, меняющую в переменной типа char местами биты с номерами n и n+1 n вводится с клавиатуры Помогите, пожалуйста!

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
642 / 563 / 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
24.04.2014, 11:44 #5
Цитата Сообщение от aLarman Посмотреть сообщение
а причем тут это?
некоторые компиляторы поддерживают long long, также такой тип появился в с++11
при том, что у автора не "некоторый" компилятор, а 100% поддерживающий long long.
Далее, судя по тому, что автор использует long long для хранения своего числа, я предполагаю, что он предварительно проверил, что sizeof(long long) равен 8
nullpointer
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
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
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
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
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
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
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
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
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 522
24.04.2014, 13:36  [ТС] #15
newbie666, почему-то результат
C++
1
2
one = sp[0];    
one = (one << 32) | sp[1];
равен sp[1]. Это так и должно быть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 13:36
Привет! Вот еще темы с ответами:

Возвратить число, в котором переставлены две младшие цифры - C++
Возвратить число, в котором переставлены две младшие цифры. Помогите, пожалуйста. Сам не могу написать код(

Перенести ведущие нули десятичного представления в младшие разряды - C++
Помогите пожалуйста !! Нужно составить программу на Си которая переносит ведущие нули десятичного представления в младшие разряды (в...

Возвратить число, в котором переставлены две младшие цифры - C++
Возвратить число, в котором переставлены две младшие цифры. Помогите, пожалуйста. Сам не могу написать код( И пожалуйста целиком...

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...) - C++
Уважаемые форумчане, нужна ваша помощь. Нужно составить программу, которая интерпретирует старшие 3 бита как некоторое число n и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.04.2014, 13:36
Ответ Создать тему
Опции темы

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