《VB2008从入门到精通(PDF格式英文版)》第196章


Public WearsHats As Boolean 
Public RunsSlowly As Boolean 
End Class 
In this definition; each attribute of PersonWithAttributes is its own data member。 Another
way to achieve the same effect is to consider each attribute as its own binary flag that is encoded
into PersonWithAttributes。 The class would be rewritten as follows: 
Class PersonWithAttributes
Public Attributes As Integer 
End Class 
In the rewritten example; the Boolean attributes are encoded into the data member
Attributes using bitwise operators。
To encode a flag in a number means to tweak the individual binary bits of a number。 To
access the individual bits; you need to create constant numbers that are a power of 2。 We use a
…………………………………………………………Page 441……………………………………………………………
CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C T E C HN IQ U E S 419 
power of 2 convention because binary is a counting system based on the power of 2。 Thus; the
three Boolean data members are converted to constants: 
Const isTall As Integer = 1 
Const wearsHats As Integer = 2 
Const runsSlow As Integer = 4
Now you could create a person that is tall and runs slowly; like this: 
Dim person As PersonWithAttributes = New PersonWithAttributes() 
person。Attributes = isTall Or runsSlow 
The variable person。Attributes is assigned the operations of isTall and runsSlow。 So if
isTall is 0001; and runsSlow is 0100; taking the bitwise OR (Or) of the two values results in 0101。 
A bitwise OR is when you pare two values; and if either value is nonzero; then the
answer is nonzero。 If you were to convert the binary number into a decimal number; you would
get the value of 5。 You could verify that the person isTall like this: 
If (person。Attributes And isTall) 0 Then 
Console。WriteLine(〃Person is tall〃) 
Else
Console。WriteLine(〃Person is not tall〃) 
End If 
A bitwise shift is the shifting of the bits to the left or to the right by the number of places indi
cated by the shift。 The following code demonstrates shifting the bits two places to the left (》 2 
The result is 2; which has the binary value 10。 
For the most part; you probably will not use the binary shift operators。 Unless you are dealing
with hardware…related programming (such as GUI interactions); whatever you can do with
flags can be replicated using a bination of Boolean types and structures。 However; when
you do encounter bitwise operators; you will recognize what they are doing。
Modulus 
The modulus operator (Mod) is very useful when you want to perform division operations and
need to know how much is left over。 For example; the following calculation yields a value of 3。 
Dim a As Integer = 17 / 5 
…………………………………………………………Page 442……………………………………………………………
420 CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C TE C H N IQ U E S 
Yet because it is an integer division; you don’t know if the value is evenly divided by 5。 The
following calculation lets you figure out the remainder for the division。 
Dim remainder As Integer = 17 Mod 5 
Increment and Decrement
The increment (+=) and decrement ( …=) operators are useful in place of the addition and subtrac
tion operators。 Visual Basic also has the *= and /= operators; which you can use in place of the
multiplication and division operators。 The idea behind these operators is to perform an operation
on the variable itself。 
Let’s say you execute this code: 
Dim a As Integer = 2 
a += 1 
Then after the increment operation; the variable a will have a value of 3。 
Overloading Operators 
Suppose you want to implement a special type; such as a plex number type; and want to
support the + sign。 To do so; you would need to implement the + operator; which; in turn; over
loads the + operator。 
As an example; let’s walk through implementing the + operator for the plex number
type。 plex numbers are numbers that have two parts: real and imaginary。 For example; a + b
is a plex number; where a is the real part and b is the imaginary part。 To add a plex
number; you add the real parts; and then add the imaginary parts; and that gives you the new
number。 The following is the plex number type; plexType; declaration。 
Public NotInheritable Class plexType 
Private ReadOnly _imaginary As Double 
Private ReadOnly _real As Double 
Public Sub New(ByVal real As Double; ByVal imaginary As Double) 
_real = real 
_imaginary = imaginary 
End Sub 
Public Overrides Function ToString() As String 
Return String。Concat(New Object() {〃(〃; _real; 〃) (〃; _imaginary; 〃)i〃}) 
End Function 
Public ReadOnly Property Imaginary() As Double 
Get 
Return _imaginary 
End Get 
End Property 
…………………………………………………………Page 443……………………………………………………………
小说推荐
返回首页返回目录