powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / побитовый сдвиг
25 сообщений из 43, страница 1 из 2
побитовый сдвиг
    #36080097
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть
byte a = 1;
нужно в нем закодировать разные значения:
если (условие1), тов первом разряде 1 , если (!условие1), то 0
если (условие2), тов во втором разряде 1 , если (!условие2), то 0
и т.д.
единица могут быть в нескольких разрядах одновременно
a <<= 1; - это если бы двигать одну и туже единицу, а как их выставлять в нужный разряд??

и как потом расшифровать разряды
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36080140
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
salom,

в цикле, или одно за другим -

создаете беззнаковое целое число, = 1
сдвигаете его на нужную позицию - в соответствии с вашей кодировкой битов.
складываете с предыдущим (простым сложением можно, но если контролируете чтобы биты не дублировались)

по выходу из цикла у вас будет число, с битами, установленными в нужном месте.

расшифровка:

Код: plaintext
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.
                        uint allBits = m_bmpValue;
			uint maskFirstBit = uint.MaxValue;
			maskFirstBit--;
			int shift = 0;
			while (allBits > 0)
			{
				uint tempBit = allBits | maskFirstBit;
				tempBit = tempBit - maskFirstBit;
				if (tempBit == 1)
				{
					uint bitOne = tempBit << shift;
					string descr = GetInfoFromServer(bitOne).Trim(); // тут по номеру бита получаем о нем разьяснение, из внешней таблицы
					if (descr.Length > 0)
					{
						result.AppendLine(descr);
					}
					else
					{
						result.AppendLine("bit not defined");
					}
				}
				shift++;
				allBits = allBits >> 1;				
			}


...
Рейтинг: 0 / 0
побитовый сдвиг
    #36080143
Фотография smeh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.Collections.BitArray
вам в помощь
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36080187
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть в c# такие операторы
:
&, |, ^
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094194
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как фильтр для датагрид сделать с проверкой : стоит ли в разряде Change единица
Код: plaintext
1.
                string filter = "Status & " + Change + "=" + Change;
                ((DataView)dt3.DefaultView).RowFilter = filter;

Не работает
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094213
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В лоб никак. SQL не поддерживает битовых операторов.
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094316
Ugums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать следующий фильтр:
Код: plaintext
1.
"Convert((columnName - columnName % n) / n, 'System.Int32') % 2 = 1"
где n - степень двойки
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094498
salom,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// стоит ли в числе mask единица на позиции
// pos (начиная с 0)
bool isOne(int mask, int pos) {
  return (mask & (1<<pos)) != 0;
}

// Устанавливает бит номер pos в значение
// value (0 или 1) в числе mask и возвращает
int setBit(int mask, int pos, int value){
  return mask | (value<<pos);
}

...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094512
рпывапыа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
salom,

про установку в 0 чушь конечно, надо так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Устанавливает бит номер pos в значение
// value (0 или 1) в числе mask и возвращает
int setBit(int mask, int pos, int value){
  if (value == 1)
    return mask | (1<<pos);
  else
    return mask & (~(1<<pos));
}

...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094549
aaaa33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
рпывапыаsalom,

про установку в 0 чушь конечно, надо так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Устанавливает бит номер pos в значение
// value (0 или 1) в числе mask и возвращает
int setBit(int mask, int pos, int value){
  if (value == 1)
    return mask | (1<<pos);
  else
    return mask & (~(1<<pos));
}


Ну и как этот код в RowFilter использовать?
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094559
dsfgwsfdgdfg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aaaa33,

зачем код, который что-то модифицирует использовать в фильтре?

если надо в SQL то там есть побитовые операции...

Код: plaintext
1.
2.
string filter = "Status & " + (1<<Change) + " > 0";
((DataView)dt3.DefaultView).RowFilter = filter;

где Change это номер бита (от 0 до 31)
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094569
aaaa33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dsfgwsfdgdfgaaaa33,

зачем код, который что-то модифицирует использовать в фильтре?

если надо в SQL то там есть побитовые операции...

Код: plaintext
1.
2.
string filter = "Status & " + (1<<Change) + " > 0";
((DataView)dt3.DefaultView).RowFilter = filter;

где Change это номер бита (от 0 до 31)

RowFilter НЕ ПОДДЕРЖИВАЕТ побитовые операции
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094796
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aaaa33,
а как этот код в RowFilter использовать??

Код: plaintext
1.
2.
3.
4.
// стоит ли в числе mask единица на позиции
// pos (начиная с 0)
bool isOne(int mask, int pos) {
  return (mask & (1<<pos)) != 0;
}
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36094905
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UgumsМожно использовать следующий фильтр:
Код: plaintext
1.
"Convert((columnName - columnName % n) / n, 'System.Int32') % 2 = 1"
где n - степень двойки

Спасибо, работает
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36095055
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
salomUgumsМожно использовать следующий фильтр:
Код: plaintext
1.
"Convert((columnName - columnName % n) / n, 'System.Int32') % 2 = 1"
где n - степень двойки

Спасибо, работает

Только не работает если n - не степень двойки (6,5....)
Можно ли эти варианты предусмотреть??
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36095160
Ugums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
salomsalomUgumsМожно использовать следующий фильтр:
Код: plaintext
1.
"Convert((columnName - columnName % n) / n, 'System.Int32') % 2 = 1"
где n - степень двойки

Спасибо, работает

Только не работает если n - не степень двойки (6,5....)
Можно ли эти варианты предусмотреть??

Разлагаешь число на степени двойки, для каждой степени определяешь фильтр, соединяешь фильтры с помощью OR.
Например, для 5:
5 = 1 + 4
"Convert((columnName - columnName % 1) / 1, 'System.Int32') % 2 = 1 OR Convert((columnName - columnName % 4) / 4, 'System.Int32') % 2 = 1"

Коряво конечно.
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36095289
salom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ugums,

Код: plaintext
Convert((Status - Status % 4) /  4, 'System.Int32') % 2 = 1

при Status=42 (101010) не срабатывает??

а если Status=16 (10000)
срабатывает и
Код: plaintext
1.
Convert((Status - Status % 3) /  3, 'System.Int32') % 2 = 1
Convert((Status - Status % 5) /  5, 'System.Int32') % 2 = 1
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36095370
Ugums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
salomUgums,

Код: plaintext
Convert((Status - Status % 4) /  4, 'System.Int32') % 2 = 1

при Status=42 (101010) не срабатывает??

4 это не разряд, а 2^(разряд - 1). Для 42 3 разряд равен 0 - 101 0 10

salomа если Status=16 (10000)
срабатывает и
Код: plaintext
1.
Convert((Status - Status % 3) /  3, 'System.Int32') % 2 = 1
Convert((Status - Status % 5) /  5, 'System.Int32') % 2 = 1


Код: plaintext
"Convert((columnName - columnName % n) / n, 'System.Int32') % 2 = 1"
Не работает, если n не степень двойки, чтобы работало:

Ugums
Разлагаешь число на степени двойки, для каждой степени определяешь фильтр, соединяешь фильтры с помощью OR.
Например, для 5:
5 = 1 + 4
"Convert((columnName - columnName % 1) / 1, 'System.Int32') % 2 = 1 OR Convert((columnName - columnName % 4) / 4, 'System.Int32') % 2 = 1"

Коряво конечно.
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36098114
zebrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatmanесть в c# такие операторы
:
&, |, ^

а чем
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36098122
zebrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatmanесть в c# такие операторы
:
&, |, ^

а чем этот вариант не устраивает?
& позволяет выставлять и читать 1 или 0 в нужном разряде
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36098323
=Lucky=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю в чем проблема.
Бирёте 1, сдвигаете на тот разряд, который нужно проверить - получаете число Check, после этого

Проверяемое значение&Chek==1 значит бит установлен.

т.е
Код: plaintext
1.
2.
3.
4.
5.
public bool CheckFilter(int bitNumber,int filter)
{
    int f=1<<BitNumber;
    return filter&f==1?true:false;
}
Естественно это самый примитивный пример.
...
Рейтинг: 0 / 0
побитовый сдвиг
    #36099213
aaaa333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zebroxGatmanесть в c# такие операторы
:
&, |, ^

а чем этот вариант не устраивает?
& позволяет выставлять и читать 1 или 0 в нужном разряде

Повторяю еще раз.
DataView.RowFilter НЕ ПОДДЕРЖИВАЕТ побитовые операции.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
побитовый сдвиг
    #38716763
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И снова эти преждевременные оптимизации.

Непонятно, зачем вообще в языке высокого уровня эти извращения из низкоуровневого мира с экономией на спичках.

Ну просто достало уже...

Код: c#
1.
ScreenWidth >> 2



Пока не погуглил, что это "быстрое" деление на 2, не понял, на кой чёрт автору понадобилось сдвигать чего-то там. А это он просто хотел выпендриться получить половину длины экрана. Но не просто просто, а очень просто (как в рекламе фирмы Сэлдом) не так ScreenWidth / 2, а вот так... Чтоб никто не догадался.


[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
побитовый сдвиг
    #38716764
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю побитовый сдвиг и горжусь этим!

Потому что экономлю время и деньги своему работодателю. Пишу простой и понятный код без изъёбств - другие сотрудники не парят мозг и не тратят время на гугление всякой ненужной хрени из-за моих заскоков.

А как у вас с этим дела обстоят?
...
Рейтинг: 0 / 0
побитовый сдвиг
    #38716766
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomeCoderНе знаю побитовый сдвиг и горжусь этим!
...
А как у вас с этим дела обстоят?

Хорошо. Главное, чтобы в погоне за "чистым кодом"
Вы не начали использовать вот это:

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
class Program
	{


		static void Main(string[] args)
		{
			Timer mainTimer;

			DataSet ds3 = new DataSet();
			DataTable dt3 = new DataTable();
			List<decimal> allListeners = new List<decimal>();
			mainTimer = new Timer();
			string sss = "3333";
			
			object middleOb = mainTimer;



			var IdoNotKnow = middleOb;
			CallMeSmart(IdoNotKnow);


		


			Console.ReadKey();
			

		}

		static void CallMeSmart(object whoAmI)
		{
			DynamicOver((dynamic)whoAmI);
		}
	

		private static void DynamicOver(Timer mainTimer)
		{
			Console.WriteLine("mainTimer");	
		}

		private static void DynamicOver(List<decimal> allListeners)
		{
			Console.WriteLine("allListeners");
		}

		private static void DynamicOver(DataTable dt3)
		{

			Console.WriteLine("dt3");			
		}

		private static void DynamicOver(DataSet ds3)
		{
			Console.WriteLine("ds3");			
		}



	}




:-)

А сдвиг итп - знать надо. Бывает, что пишутся интеграции с устройствами, которые не IBM.....
:-)
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / побитовый сдвиг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]