2017-08-08 64 views
-1

我不明白这个逻辑与VB。我见过一个例子以恒定:这些带有条件逻辑的If语句的目的是什么?

Enum Turnos 
    Ninguno = 0  'nothing the constant is =  0 
    Desayuno = &H380 'breakfast the constant is =  896 
    comida = &H1E000 'lunch  the constant is = 122888 
    Cena = &HE00003 'dinner  the constant is = 14680067 
end Enum 

Sub Main() 
    Console.WriteLine("Es la hora {0:hh:mm:ss tt}", DateTime.Now) 
    Console.WriteLine("Turno: {0:G}", QuéTurnoEsAhora()) 
    Console.ReadKey() 
End Sub 

Public Function QuéTurnoEsAhora() As Turnos 
    Dim ahora As Integer = CInt(Math.Pow(2, DateTime.Now.Hour)) 
    If (ahora And Turnos.DESAYUNO) <> 0 Then Return Turnos.DESAYUNO 
    If (ahora And Turnos.COMIDA) <> 0 Then Return Turnos.COMIDA 
    If (ahora And Turnos.CENA) <> 0 Then Return Turnos.CENA 
    Return Turnos.NINGUNO 
End Function 

使用下面的函数

'If (ahora and Turnos.DESAYUNO) <> 0 then returns Turnos.DESAYUNO 

我的问题是,为什么(ahora而Turnos.DESAYUNO))是<> 0?而下一个功能

'If (ahora And Turnos.COMIDA) = 0' 

对不起,我不明白哪个是逻辑。有人能帮助我吗?

+1

? – Ares

+0

为什么不解释*你想要做什么? – Plutonix

+0

你的结构'&H ...'不正确:) – Codexer

回答

1

每个在你的枚举常量是一个位掩码,它与按应吃了一顿一天中的某些时间重叠。

例如,具有十六进制值380和十进制值896的早餐具有二进制值(24位)000000000000001110000000。从最低有效位开始计数,从零开始计数第7位,第8位和第9位很高。正如在另一个答案中指出的那样,按位来计算当前小时的数值。仅当当前小时数等于7,8或9时,结果为1.

其他餐饮也是如此。还有就是在吃午饭您的评论的错误,应该是小数122880,未122888.

这是为什么你使用`Math.Pow`表

enter image description here

+0

超级解释!!非常感谢 – PJUAREZG

1

And这里充当bitwise and
我认为一个简单的例子可以帮助您理解它:

Enum bitwiseExample 
    Empty = 0  ' 0000 
    One = 1  ' 0001 
    Two = 2  ' 0010 
    Four = 4  ' 0100 
    Eight = 8  ' 1000 
EndEnum 

Dim x as integer = 6 ' 0110 

x and bitwiseExample.Empty = 0 ' since 0110 & 0000 = 0000 
x and bitwiseExample.One = 0 ' since 0110 & 0001 = 0000 
x and bitwiseExample.Two = 2 ' since 0110 & 0010 = 0010 
x and bitwiseExample.Four = 4 ' since 0110 & 0100 = 0100 
+0

谢谢Zohar现在对我来说很清楚了。 – PJUAREZG