【问题标题】:Bitwise operations in Visual Basic .NETVisual Basic .NET 中的按位运算
【发布时间】:2010-07-19 19:28:06
【问题描述】:

我正在将 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

任何帮助将不胜感激。

【问题讨论】:

    标签: c# vb.net bit-manipulation


    【解决方案1】:

    你不想使用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;
    }
    

    【讨论】:

    • 非常感谢,除了回答我还会考虑你的。再次感谢!佩德罗·杜索
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多