Побитовые операции в Visual Basic .NET - PullRequest
1 голос
/ 19 июля 2010

Я переписываю какое-то старое приложение в VB.NET для C # и ASP.NET 3.5. Все идет хорошо, но у меня есть эта проблема - и, поскольку база данных не будет изменена, я должен найти решение этой проблемы.

Старое приложение сохраняет список желаемых дней (с воскресенья по субботу) в байтах. Вот как это сделать:

If chkDaily.Checked Then
            daysBitmask = 127    ' This is for a full week
        Else
            For i = 0 To chklstWeekly.Items.Count - 1
                If chklstWeekly.Items(i).Selected Then
                    ' List the selected items
                    daysBitmask += 2 ^ CInt(chklstWeekly.Items(i).Value)
                    daysBitmask = daysBitmask
                    Message2.InnerText = daysBitmask
                End If
            Next
        End If

и я преобразовал его в

        if (rdbDaysList.SelectedValue == DAILY)
            daysBitmask = 127;
        //This is for a full week
        else
            foreach (var d in ckbDaysList.Items)
            {
                ListItem day = d as ListItem;
                if (day.Selected)
                {
                    daysBitmask += Convert.ToByte(Math.Pow(2, Convert.ToDouble(day.Value)));
                }
            }

Это работает. Моя самая большая проблема заключается в преобразовании байта в код C #. Оригинальный VB.NET прямо выше:

            If (dr("DesireDays").ToString() = "127") Then
                chkDaily.Checked = True
                chkWeekly.Checked = False
                chklstWeekly.Enabled = False
            Else
                chkWeekly.Checked = True
                chkDaily.Checked = False
                chklstWeekly.Enabled = True

                Dim AD As Integer = dr("DesireDays").ToString()
                Dim i As Integer

                For i = 0 To chklstWeekly.Items.Count - 1
                    If AD And 2 ^ i Then
                        chklstWeekly.Items(i).Selected = True

                    End If
                Next i

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 19 июля 2010

Вы не хотите использовать ToDouble, так как вы хотите int (это то, что дает CInt).

Кроме того, для выполнения степеней двойки сдвиг битов обычнонемного яснее, чем показывать экспоненты (хотя выбирайте то, что работает для вас).

В качестве отступления обычно безопаснее использовать побитовое OR (вертикальный | бар), а не сложение.

ListItem day = d as ListItem;

if (day.Selected)
{
    daysBitmask |= 1 << Convert.ToInt32(day.Value);
}

Чтобы ответить на актуальный вопрос, будет работать обратное:

ListItem day = d as ListItem;

if ((daysBitmask & (1 << Convert.ToInt32(day.Value))) > 0)
{
    day.Selected = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...