Scott Hanselman

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

May 24, 2005 Comment on this post [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
Hosting By
Hosted in an Azure App Service
May 24, 2005 15:48
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.
May 24, 2005 17:09
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.
May 24, 2005 17:21
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)
May 24, 2005 23:19
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
May 25, 2005 8:05
I fixed the link
May 27, 2005 6:15
>but when it comes down to manipulating raw Bytes, the language sucks Whatever, Hanselman! And you know what? Bytes suck!
June 02, 2005 1:24
>And you know what? Bytes suck! Said from a true VB programmer:)

Comments are closed.

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