Scott Hanselman

Machine.Shift.Left and Bit Shifting in VB.NET

May 24, '05 Comments [7] Posted in Coding4Fun | Tools
Sponsored By

I was converting some C# 2.0 code for the next Coding4Fun Some Assembly Required to VB.NET. I happened to use an automated C# to VB.NET tool to get me started.

It converted this C# code:

if( (btData - '0') <= 9)
{
   receivedChecksum = (byte)((btData - '0') << 4);
}
else
{
   receivedChecksum = (byte)((btData - 'A' + 10) << 4);
}

Into this attempt at VB.NET code.

If btData - "0" <= 9 Then
   
receivedChecksum = System.Convert.ToByte(Machine.Shift.Left((btData - "0"), 4))
Else
  
receivedChecksum = System.Convert.ToByte(Machine.Shift.Left((btData - "A" + 10), 4))
End If

Of course, Machine.Shift.Left (and .Right) doesn't exist. Looks like something that the convertor folks missed? Perhaps they forgot to implement?

At any rate, you can use the standard bit shifting << and >> operators in VB.NET 2.0 like this.

If btData - "0" <= 9 Then
   
receivedChecksum = System.Convert.ToByte((btData - "0") << 4)
Else
   
receivedChecksum = System.Convert.ToByte((btData - "A" + 10) << 4)
End If

And I continue forward...

UPDATED:

You might think that VB.NET would let you use ^= if you can << and >>.

Well, it will compile things like

foo ^= bar

But the ^= operator means Power Of in VB, not Xor as I thought it should. Doh! I'm out of VB.NET practice.

VB.NET folks, I'm sorry, but when it comes down to manipulating raw Bytes, the language sucks.

foo = foo Xor bar

And I continue forward...

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb
Tuesday, 24 May 2005 15:48:27 UTC
It's there, and it does suck, but then again look at the target audience... Every time I show any kind of bit manipulation to VB students, their eyes glaze over like a Kristy Kreme donut. They can't imagine every wanting or needing to do that.
Scott
Tuesday, 24 May 2005 17:09:06 UTC
I dont think you need to apologize - the language was not designed for that usage and does not pretend to be. Just like C# sucks for Office interop - no apology necessary.
Tuesday, 24 May 2005 17:21:05 UTC
Scott, I've worked with VB for years and if I needed some more horsepower, I just went to C++. VB is a little too high level for heavy duty crunching. No apologies necessary.

(Trackback didn't work, as far as I can tell, so here's mine on yours: http://dotnothing.blogspot.com/2005/05/bit-shifting-in-vbnet.html)
Tuesday, 24 May 2005 23:19:31 UTC
Good article. How do they decide which features get left out of C# or VB. It seems like they just ought to implement all in both. (Other than types that VB can't handle.)

The Some Assembly Required link

http://msdn.com/coding4fun/assemblyrequired

doesn't work. It gives a 404 at microsoft.com.

Aaron
Aaron
Wednesday, 25 May 2005 08:05:49 UTC
I fixed the link
Scott Hanselman
Friday, 27 May 2005 06:15:55 UTC
>but when it comes down to manipulating raw Bytes, the language sucks

Whatever, Hanselman! And you know what? Bytes suck!
Thursday, 02 June 2005 01:24:07 UTC
>And you know what? Bytes suck!

Said from a true VB programmer:)

Eric
Comments are closed.

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.