Visual Basic .NET中的按位操作

时间:2010-07-19 19:28:07

标签: c# vb.net bit-manipulation

我正在将一些旧的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 个答案:

答案 0 :(得分:2)

您不想使用ToDouble,因为您需要int(这是CInt为您提供的内容)。

此外,对于做2的幂,比特移位通常比做指数更清晰(尽管选择适合你的任何东西)。

顺便说一下,使用按位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;
}