I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Author |
Message |
Christopher H. Lac #1 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Here's what I'm trying to do without a clue where to start. I want to store settings in a binary field in a database [that's the easy part for me] let's say i had 3 options, Add, Edit, Approve, and Delete and these were different bits in a binary respectively. 0000 No options 1000 Add only 1001 Add and Delete 0100 Edit only etc, etc... First, how do i convert this binary into a Hex (&H) to set to constants in VB? Second, how do i do comparisons to see if a bit is set? I'll assume something using the And operator.. Third, is this all worth it? I could just as easily use a text field to do the same.. A - Add AD Add and Delete etc, etc... Thanks for the wisdom, -=Chris
|
Fri, 15 Feb 2002 03:00:00 GMT |
|
 |
Matthew Arnheite #2 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
You may be better off working with the decimal values instead of binary values. I have had a lot of success in the past with using decimal values: 0 = &H0 = 0000 No options 8 = &H8 = 1000 Add only 9 = &H9 = 1001 Add and Delete 4 = &H4 = 0100 Edit only 1 = &H1 = 0001 Delete With this method you can convert to hexidecimal using the Hex function. You can then use the logical operators to do your comparisons. Something like: Const USER_ADD = &H8 Const USER_NONE = &H0 Const USER_ADDDELETE = &H9 Const USER_EDIT = &H4 Const USER_DELETE = &H1 If User.Permissions And USER_EDIT Then ' Do something End IF -- Matthew Arnheiter Flash Creative Management http://www.flashcreative.com
Quote: > Here's what I'm trying to do without a clue where to start. > I want to store settings in a binary field in a database [that's the easy > part for me] > let's say i had 3 options, Add, Edit, Approve, and Delete and these were > different bits in a binary respectively. > 0000 No options > 1000 Add only > 1001 Add and Delete > 0100 Edit only > etc, etc... > First, how do i convert this binary into a Hex (&H) to set to constants in > VB? > Second, how do i do comparisons to see if a bit is set? > I'll assume something using the And operator.. > Third, is this all worth it? > I could just as easily use a text field to do the same.. > A - Add > AD Add and Delete > etc, etc... > Thanks for the wisdom, > -=Chris
|
Fri, 15 Feb 2002 03:00:00 GMT |
|
 |
Mike Ansti #3 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Quote: >Here's what I'm trying to do without a clue where to start. >I want to store settings in a binary field in a database [that's the easy >part for me] >let's say i had 3 options, Add, Edit, Approve, and Delete and these were >different bits in a binary respectively. >0000 No options >1000 Add only >1001 Add and Delete >0100 Edit only >etc, etc... >First, how do i convert this binary into a Hex (&H) to set to constants in >VB?
Why convert to hex? - use (based on your binary) or a user-defined Type:- CONST OPT_NONE = 2^0 CONST OPT_ADD = 2^4 CONST OPT_EDIT = 2^3 etc Quote: >Second, how do i do comparisons to see if a bit is set? >I'll assume something using the And operator..
IF (myVariable And OPT_NONE)<>0 Then ' "None" code... IF (myvariable And OPT_ADD)<>0 Then ' "Add" code... Quote: >Third, is this all worth it? >I could just as easily use a text field to do the same.. >A - Add >AD Add and Delete >etc, etc...
Bit-wise variables do reduce storage - in a Long you'll have 32 options in 4 bytes compared to 32 characters in 32 bytes (ASCII) or 64 bytes (UNICODE). Speed will also be quicker as opposed to checking Mid$ of your option string. Just remember to use readable constants. Quote: >Thanks for the wisdom, >-=Chris
|
Sat, 16 Feb 2002 03:00:00 GMT |
|
 |
Christopher H. Lac #4 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
ok, now for my next stupid question... How do i put these together into a variable? Permissions = CONST OPT_NONE + CONST OPT_ADD ? Thanks, -=Chris
Quote:
> >Here's what I'm trying to do without a clue where to start. > >I want to store settings in a binary field in a database [that's the easy > >part for me] > >let's say i had 3 options, Add, Edit, Approve, and Delete and these were > >different bits in a binary respectively. > >0000 No options > >1000 Add only > >1001 Add and Delete > >0100 Edit only > >etc, etc... > >First, how do i convert this binary into a Hex (&H) to set to constants in > >VB? > Why convert to hex? - use (based on your binary) or a user-defined Type:- > CONST OPT_NONE = 2^0 > CONST OPT_ADD = 2^4 > CONST OPT_EDIT = 2^3 etc > >Second, how do i do comparisons to see if a bit is set? > >I'll assume something using the And operator.. > IF (myVariable And OPT_NONE)<>0 Then ' "None" code... > IF (myvariable And OPT_ADD)<>0 Then ' "Add" code... > >Third, is this all worth it? > >I could just as easily use a text field to do the same.. > >A - Add > >AD Add and Delete > >etc, etc... > Bit-wise variables do reduce storage - in a Long you'll have 32 options in 4 > bytes compared to 32 characters in 32 bytes (ASCII) or 64 bytes (UNICODE). > Speed will also be quicker as opposed to checking Mid$ of your option > string. Just remember to use readable constants. > >Thanks for the wisdom, > >-=Chris
|
Sat, 16 Feb 2002 03:00:00 GMT |
|
 |
MS #5 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
You can add the options using + but this is prone to error. If you add the same option twice you get the next option instead. If the options are 0, 1, 2, 4, 8, etc 0 + 1 = 1 0 + 1 + 4 = 5 but 1 + 1 = 2 A better way is to use the Or operator. 0 Or 1 = 1 0 Or 1 Or 4 = 5 and 1 Or 1 = 1 You test them using the And operator If (intOptions And 4) Then ... This works because (intOptions And 4) is always 0 unless you added/or-ed 4 into it in the first place. In this case it would give 4 as the result and anything that isn't false (zero) is considered to be true. Regards, Simon Jones MillStream Designs Ltd Independent IT Consultants
ok, now for my next stupid question... How do i put these together into a variable? Permissions = CONST OPT_NONE + CONST OPT_ADD ?
|
Sat, 16 Feb 2002 03:00:00 GMT |
|
 |
Graduate Associates L #6 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
The problem with plus is that if the constants are not disjoint, then adding them together will give rise to side effects. Using Matthew's constants... Const USER_ADD = &H8 Const USER_NONE = &H0 Const USER_ADDDELETE = &H9 Const USER_EDIT = &H4 Const USER_DELETE = &H1 If you set Permissions = USER_ADD + USER_ADDDELETE the result is &H11 which effectively evaluates to USER_DELETE, probably not what was intended. The solution is to use OR as the operator, that way if a bit is set in more than one of the constants it's effect will only be felt once. Regards Paul Hatcher, MCSD Principal Consultant Graduate Associates Ltd
|
Sun, 17 Feb 2002 03:00:00 GMT |
|
 |
Christopher H. Lac #7 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Example please? nothing i try works using Or Permissions = USER_ADD Or USER_EDIT USER_EDIT Or USER_ADD = Permissions ? Thanks, -=Chris
Quote: > The problem with plus is that if the constants are not disjoint, then > adding them together will give rise to side effects. Using Matthew's > constants... > Const USER_ADD = &H8 > Const USER_NONE = &H0 > Const USER_ADDDELETE = &H9 > Const USER_EDIT = &H4 > Const USER_DELETE = &H1 > If you set Permissions = USER_ADD + USER_ADDDELETE the result is &H11 > which effectively evaluates to USER_DELETE, probably not what was > intended. The solution is to use OR as the operator, that way if a bit is > set in more than one of the constants it's effect will only be felt once. > Regards > Paul Hatcher, MCSD > Principal Consultant > Graduate Associates Ltd
|
Mon, 18 Feb 2002 03:00:00 GMT |
|
 |
David Elli #8 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Here's some actual code I used: Public User_Rights As Long 'Constants for the rights Private Const FLAG_DELETE_TRANSMITTAL = &H1 'Can delete transmittals Private Const FLAG_CREATE_TRANSMITTAL = &H2 'Can create a new transmittal Private Const FLAG_MODIFY_TRANSMITTAL = &H8 'Can do most anything to a transmittal but delete it Private Const FLAG_ADD_DOCUMENTS = &H10 'Allow manual document entry Private Const FLAG_MODIFY_ADDRESS = &H20 'Can modify the address information Private Const FLAG_EDIT_ROLES = &H40 Private Const FLAG_EDIT_TRANSMITTAL = &H80 Private Const FLAG_EDIT_LISTS = &H100 'The 4 types of roles that a person can fall under Private Const ROLE_GUEST = 0 'Can't do anything Private Const ROLE_STANDARD = FLAG_MODIFY_TRANSMITTAL Or FLAG_ADD_DOCUMENTS Or FLAG_MODIFY_ADDRESS Or FLAG_CREATE_TRANSMITTAL Or FLAG_EDIT_ROLES Private Const ROLE_ADMIN = ROLE_STANDARD Or FLAG_DELETE_TRANSMITTAL Or FLAG_EDIT_TRANSMITTAL Or FLAG_EDIT_LISTS Private Const ROLE_SYS_ADMIN = ROLE_ADMIN Private Sub GetUserRights() Select Case GetUserRightsLevel() 'Gets a numeric level from the database Case RIGHTS_STANDARD User_Rights = ROLE_STANDARD Case RIGHTS_ADMIN User_Rights = ROLE_ADMIN Case RIGHTS_SYS_ADMIN User_Rights = ROLE_SYS_ADMIN Case Else 'Set the default rights User_Rights = ROLE_GUEST End Select End Sub Heres some code to enable/disable some toolbar buttons depending on their rights. The Ands will return zero if they don't have that bit set, otherwise they return a non-zero value (specifically, the value of the flag). With mdiMain.Toolbar3 .Buttons(BUTTON_SAVE).Enabled = (User_Rights And FLAG_MODIFY_TRANSMITTAL) .Buttons(BUTTON_ADDRESS).Enabled = (User_Rights And FLAG_MODIFY_ADDRESS) .Buttons(BUTTON_NEW).Enabled = (User_Rights And FLAG_CREATE_TRANSMITTAL) .Buttons(BUTTON_CANCEL).Enabled = (User_Rights And FLAG_MODIFY_TRANSMITTAL) End With
|
Tue, 19 Feb 2002 03:00:00 GMT |
|
 |
Christopher H. Lac #9 / 9
|
 I'm sure this is easy...but... [Decimal -> Hex and Bitwise]
Thanks!!!! That clears things up perfectly! -=Chris
Quote: > Here's some actual code I used: > Public User_Rights As Long > 'Constants for the rights > Private Const FLAG_DELETE_TRANSMITTAL = &H1 'Can delete transmittals > Private Const FLAG_CREATE_TRANSMITTAL = &H2 'Can create a new transmittal > Private Const FLAG_MODIFY_TRANSMITTAL = &H8 'Can do most anything to a > transmittal but delete it > Private Const FLAG_ADD_DOCUMENTS = &H10 'Allow manual document entry > Private Const FLAG_MODIFY_ADDRESS = &H20 'Can modify the address > information > Private Const FLAG_EDIT_ROLES = &H40 > Private Const FLAG_EDIT_TRANSMITTAL = &H80 > Private Const FLAG_EDIT_LISTS = &H100 > 'The 4 types of roles that a person can fall under > Private Const ROLE_GUEST = 0 'Can't do anything > Private Const ROLE_STANDARD = FLAG_MODIFY_TRANSMITTAL Or FLAG_ADD_DOCUMENTS > Or FLAG_MODIFY_ADDRESS Or FLAG_CREATE_TRANSMITTAL Or FLAG_EDIT_ROLES > Private Const ROLE_ADMIN = ROLE_STANDARD Or FLAG_DELETE_TRANSMITTAL Or > FLAG_EDIT_TRANSMITTAL Or FLAG_EDIT_LISTS > Private Const ROLE_SYS_ADMIN = ROLE_ADMIN > Private Sub GetUserRights() > Select Case GetUserRightsLevel() 'Gets a numeric level from the database > Case RIGHTS_STANDARD > User_Rights = ROLE_STANDARD > Case RIGHTS_ADMIN > User_Rights = ROLE_ADMIN > Case RIGHTS_SYS_ADMIN > User_Rights = ROLE_SYS_ADMIN > Case Else > 'Set the default rights > User_Rights = ROLE_GUEST > End Select > End Sub > Heres some code to enable/disable some toolbar buttons depending on their > rights. The Ands will return zero if they don't have that bit set, > otherwise they return a non-zero value (specifically, the value of the > flag). > With mdiMain.Toolbar3 > .Buttons(BUTTON_SAVE).Enabled = (User_Rights And > FLAG_MODIFY_TRANSMITTAL) > .Buttons(BUTTON_ADDRESS).Enabled = (User_Rights And
FLAG_MODIFY_ADDRESS) Quote: > .Buttons(BUTTON_NEW).Enabled = (User_Rights And
FLAG_CREATE_TRANSMITTAL) Quote: > .Buttons(BUTTON_CANCEL).Enabled = (User_Rights And > FLAG_MODIFY_TRANSMITTAL) > End With
|
Sat, 23 Feb 2002 03:00:00 GMT |
|
|
|