2014-03-04 4 views
2

Извините за формулировку названия, но не забудьте, как еще это сложить.Как определить, сколько частей составляют целое число

Код может произнести больше чем описание. Я сбил этот псевдо-код, чтобы попытаться передать то, что я пытаюсь достичь. На примере ниже я хочу «Test1» и «test2» к выходу, но не «TEST3» или «test4»

Dim DEBUG_LOGLEVEL_ALWAYSLOG As Integer = 0 
Dim DEBUG_LOGLEVEL_INFORMATIONAL As Integer = 2 
Dim DEBUG_LOGLEVEL_HIGHLEVEL As Integer = 4 
Dim DEBUG_LOGLEVEL_MIDLEVEL As Integer = 8 
Dim DEBUG_LOGLEVEL_LOWLEVEL As Integer = 16 
Dim DEBUG_LOGLEVEL_SUBROUTINE As Integer = 32 
Dim DEBUG_LOGLEVEL_FUNCTIONHIGHLEVEL As Integer= 64 
Dim DEBUG_LOGLEVEL_FUNCTIONLOWLEVEL As Integer= 128 

Dim DEBUG_LOGGING_LEVEL As Integer = DEBUG_LOGLEVEL_INFORMATIONAL+DEBUG_LOGLEVEL_HIGHLEVEL+DEBUG_LOGLEVEL_SUBROUTINE+DEBUG_LOGLEVEL_FUNCTIONHIGHLEVEL 

Debug_AddLogEntry("Test1", DEBUG_LOGLEVEL_INFORMATIONAL) 
Debug_AddLogEntry("Test2", DEBUG_LOGLEVEL_HIGHLEVEL) 
Debug_AddLogEntry("Test3", DEBUG_LOGLEVEL_MIDLEVEL) 
Debug_AddLogEntry("Test4", DEBUG_LOGLEVEL_SUBROUTINE) 


Function Debug_AddLogEntry(text, loglevel) 
    IF loglevel is contained within DEBUG_LOGGING_LEVEL 
    'Code 
Endif 
End Function 

ответ

3

Вы довольно близко. Во-первых, вы хотите, чтобы все было в силе 2. У вас почти есть это, просто измените свою первую строчку. 0 не является степенью 2, но 1:

Dim DEBUG_LOGLEVEL_ALWAYSLOG As Integer = 1 

Тогда для функции отладки, вы можете использовать операцию побитового для проверки.

Function Debug_AddLogEntry(text, loglevel) 
    IF (loglevel And DEBUG_LOGGING_LEVEL) = loglevel 

Это вернет true только в том случае, если бит установлен в единицу.

Кроме того, вы можете изменить свои первоначальные определения, чтобы они были более понятными (и более легкими для добавления) с помощью побитовых сдвигов. Например:

Dim DEBUG_LOGLEVEL_ALWAYSLOG As Integer = 1 << 0 
Dim DEBUG_LOGLEVEL_INFORMATIONAL As Integer = 1 << 1 
Dim DEBUG_LOGLEVEL_HIGHLEVEL As Integer = 1 << 2 
Dim DEBUG_LOGLEVEL_MIDLEVEL As Integer = 1 << 3 
... 
etc 
+0

Вау, спасибо всем за ответы! Первое сообщение здесь, так сильно впечатлено :) У меня изначально был DEBUG_LOGLEVEL_ALWAYSLOG = 1, но затем он был изменен на 0, doh! Я дам ему попытку завтра, поскольку это был долгий день и нужно спать. – Jimmy

Смежные вопросы