С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135

Бинарный сдвиг - не обнуляется значение после сдвигах всех битов

22.04.2015, 07:18. Показов 2175. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, не пойму, почему не обнуляется значение после сдвигах всех битов? Это доставляет некоторые проблемы... Судя повсему, шарп / компилятор не позволяет выполнить полный сдвиг, можно это как-то исправить?
Миниатюры
Бинарный сдвиг - не обнуляется значение после сдвигах всех битов  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.04.2015, 07:18
Ответы с готовыми решениями:

После обновления таблицы значение в ComboBox обнуляется
Мне необходимо запись новую строку в таблицу . У меня 3 связанные между собой таблицы. Сначала я записываю строку в одну таблицу. Затем...

После завершения функции заданное в ней значение переменной обнуляется
После завершения функции заданное в ней значение переменной обнуляется. Возможно ли решить данную проблему? Если да, то как?

Сдвиг битов
Как можно сдвинуть только младшие биты? Мне нужно 11111100 преобразовать в 11110011.

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14165 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
22.04.2015, 08:01
Лучший ответ Сообщение было отмечено PVD как решение

Решение

PVD, потому что оператор >> вставляет слева старший бит. То есть когда там 1, то при сдвиге останется 1, если 0 то и будет 0. В Java есть оператор >>> (zero fill right shift). В C# такого нет поэтому делай как-то по другому. Например сначала сдвигаем на 1 бит и затем битовой маской сбрасываем старший бит. Тогда следующие операции сдвига будут уже добавлять 0 справа как тебе необходимо.
1
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
22.04.2015, 08:03  [ТС]
Да, уже сделал по другому, спасибо
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.04.2015, 11:45
Лучший ответ Сообщение было отмечено PVD как решение

Решение

Цитата Сообщение от OwenGlendower Посмотреть сообщение
потому что оператор >> вставляет слева старший бит.
Надо заметить, что касается это только знаковых типов и называется знаковым расширением (sign extension)

Цитата Сообщение от PVD Посмотреть сообщение
почему не обнуляется значение после сдвигах всех битов?
Давайте по порядку:

1. (uint)0xFFFFFFFF >> (byte)32
Касты в uint и в byte здесь ничего не делают: числовая константа, записанная в 16-м формате по умолчанию имеет тип uint или ulong, если значение больше, чем uint.MaxValue.
Так как uint является беззнаковым типом, то почему значения слева не обнуляются?
Потому что x >> 32 равносильно x >> 0, что оговорено в спецификации языка:
7.8 Shift operators
Shift right:
C#
1
2
3
4
int operator >>(int x, int count);
uint operator >>(uint x, int count);
long operator >>(long x, int count);
ulong operator >>(ulong x, int count);
  • When the type of x is int or uint, the shift count is given by the low-order five bits of count. In other words, the shift count is computed from count & 0x1F.
  • When the type of x is long or ulong, the shift count is given by the low-order six bits of count. In other words, the shift count is computed from count & 0x3F.
Как видим, если сдвигается 32-битное число, то значение сдвига берется по маске 0x1F — это в двоичной системе 0001 1111.
Число 32 в двоичном представлении выглядит так: 0010 0000.

0010 00002
0001 11112
----------- AND
0000 00002

0xFFFFFFFF >> 0 = 0xFFFFFFFF.

2. (ulong)0xFFFFFFFF >> (byte)32
Здесь вы приводите беззнаковый 32-битный тип к беззнаковому 64-битному, значит знакового расширения нет и маска для значения сдвига равна 0x3F или 0011 1111

0010 00002
0011 11112
----------- AND
0010 00002 = 3210

0x00000000FFFFFFFF >> 32 = 0x00000000000000

3. (int)0xFFFFFFFF >> (byte)32
Здесь та же ситуация, что в первом примере: сдвиг вправо 32-битного числа на 32 бита равносилен сдвигу вправо на 0 бит.

4. (long)0xFFFFFFFF >> (byte)32
Здесь та же ситуация, что во втором случае.
Надо только заметить, что записанное в шестнадцатеричном представлении число по умолчанию имеет беззнаковый тип (uint в данном случае), потому приведение его к большему, но знаковому типу, не приводит к знаковому расширению, следовательно значение (long)0xFFFFFFFF = 0x00000000FFFFFFFF.

0x00000000FFFFFFFF >> 32 = 0x0000000000000000

5. 0xFFFFFFFFFFFFFFFF >> 64
Снова ситуация, как во втором случае: тип ulong (нет знакового расширения) сдвигается вправо на 64 бита (0100 00002).
Применяем маску 0x3F:
0100 00002
0011 11112
----------- AND
0000 00002

В итоге этот сдвиг равносилен сдвигу на 0 бит вправо.

6. (byte)0xFF >> 8
Тут все просто: в выдержке из спека выше видно, что оператор сдвига вправо не определен для типа byte, потому значение конвертируется в ближайшее подходящее (int) и производится сдвиг на нем, то есть:
(byte)0xFF >> 8 = (int)0x000000FF >> 8 = 0
1
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
22.04.2015, 12:05  [ТС]
Ну а собственно, зачем зациклили сдвиг, это дает какие-то преимущества?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.04.2015, 12:07
Цитата Сообщение от PVD Посмотреть сообщение
зачем зациклили сдвиг
О каком зацикливании речь?
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
22.04.2015, 12:09  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
О каком зацикливании речь?
Потому что x >> 32 равносильно x >> 0,
36 равносильно 4 и т.д.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
22.04.2015, 12:20
PVD, не знаю, на MSDN висит вот такая отмазка:
The << operator masks expression2 to avoid shifting expression1 by too much. Otherwise, if the shift amount exceeded the number of bits in the data type of expression1, all the original bits would be shifted away to give a trivial result. To ensure that each shift leaves at least one of the original bits, the shift operators use the following formula to calculate the actual shift amount: mask expression2 (using the bitwise AND operator) with one less than the number of bits in expression1.
Подход, конечно, странный — "оставить хоть что-то".
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
22.04.2015, 12:22  [ТС]
Да, похоже защита от того, кто не знает, что пишет..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2015, 12:22
Помогаю со студенческими работами здесь

Сдвиг битов
есть задание : Дано 16 битное слово ..поменять местами 1 и 3 биты.. Как поменять эти биты.. используя команды shl и shr/// или...

Циклический сдвиг битов
Создайте функцию, которая перемещает биты для unsigned int на заданное число битов влево, причем выходящие при сдвиге за левую границу...

Сдвиг битов в числе
Доброго времени суток! Задача: написать прогу для сдвига битов на указанное кол-во позиций влево. Решение: решил ниже, но вот думаю...

Циклический сдвиг битов!
Очень срочно нужна помощь. Нужно реализовать функцию, которая осуществляет циклический сдвиг битов на 1 бит вправо в левом полубайте...

Сдвиг битов. Ассемблер.
Привет всем. Подскажите как можно реализовать сдвиг на n позиций? Я правильно понимаю, что только через цикл и никак иначе? МК -...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru