Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# Converting Zero-Fill Right Shift to .NET

Posted on 2004-09-16
Medium Priority
1,489 Views
In Javascript, if I evaluate the following like so:

var i=-306674912;

The zero-fill right-shift assignment operator (and thus the alert box) produces:

1994146192

How can I get this behavior in .NET? It doesn't have a ">>>+" operator or a ">>>" operator.

Thanks!

0
Question by:electricstory
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 4

LVL 4

Expert Comment

ID: 12079880
Use the >> operator for zero-fill right shift and << operator for zero-fill left shift. C# code:

long i = 1;
for(int j = 0; j < 64; j++)
{
Console.Write("i={0},", i);
Console.WriteLine("\ti << {0} = {1}", j, i << j);
}

HTH
0

Author Comment

ID: 12079898
Well, maybe I'm giving it the wrong name. But the ">>" operator isn't the same as the ">>>" operator. Try it. If you can get the same result as the javascript example above in .NET, you get the points.
0

LVL 4

Accepted Solution

vigrid earned 2000 total points
ID: 12080152
static void Main(string[] args)
{
int i = -306674912;  // 11111111 11111111 11111111 11111111 11101101 10111000 10000011 00100000
int k = 1994146192; // 00000000 00000000 00000000 00000000 01110110 11011100 01000001 10010000
int j1 = ZFRS(i, 1);   // 00000000 00000000 00000000 00000000 00110110 11011100 01000001 10010000
}

private static int ZFRS(int i, int j)
{
bool maskIt = (i < 0);
i = i >> j;
i &= 0x7FFFFFFF;
return i;
}
0

LVL 4

Expert Comment

ID: 12080160
int i = -306674912;  // 11111111 11111111 11111111 11111111 11101101 10111000 10000011 00100000
int k = 1994146192; // 00000000 00000000 00000000 00000000 01110110 11011100 01000001 10010000
int j1 = ZFRS(i, 1);   // 00000000 00000000 00000000 00000000 01110110 11011100 01000001 10010000

The comment was wrong. I left it after some tries and forgot to change it.

HTH
0

Author Comment

ID: 12081142
You rock.
0

Author Comment

ID: 12082071
Actually, if you're still looking in and feel so inclined, Vigrid, I can still use your help. Your mask only works for that one particular example. Positive numbers seem to be the same between >>> and the .net >>, but there's that left fill bit with negative numbers. Is there any (simple) way to perform that left fill every time a negative number comes up? I'll open a new question on it.

int i = -306674912;  // 11111111 11111111 11111111 11111111 11101101 10111000 10000011 00100000
int k = 1994146192; // 00000000 00000000 00000000 00000000 01110110 11011100 01000001 10010000
0

LVL 4

Expert Comment

ID: 12091282
What do you expect to get from the method? Please just give me the input and needed output bits. Few examples would be great. I'm not so experienced in JavaScript, so I wasn't 100% sure if my solution will work every time.
0

Author Comment

ID: 12092474
It looks like many operations result in an overflow error in .NET if you don't use longs. Maybe this is simpler than I think it is. Anyway, I've expanded your function, and this seems to work, though it's admitted kludgy (and I know I'm awful about naming variables). Thanks for your help; my grasp of hex was pretty shaky before this, but I think I'm getting it!

Private Shared Function ZFRS(ByVal l As Long, ByVal j As Integer) As Long
Dim maskIt As Boolean = (l < 0)
l = l >> j
Dim int As Integer = 0
Do While Hex(l).Substring(int, 1) = "F"
int += 1
If int = 15 Then Exit Do
Loop
Dim strText As String = Hex(l)

Dim strHex As String

If int <> 8 Then

Dim intZero As Integer
Dim strHexDigit As String

'For every four shift bits, you'll have a hex 0; add it to your shift digit
For intZero = 0 To Math.Floor(j / 4) - 1
strHexDigit += "0"
Next
Dim strFinalDigit As String = strText.Substring(8 + intZero, 1)

'otherwise, put in zeroes in front of the last hex digit
Dim lFinalDigit As Long

Dim intMod As Integer
If j >= 4 Then
intMod = j Mod 4
Else
'intMod = 0
intMod = j
End If

For intZero = 0 To intMod - 1
strOffset += "0"
Next

Select Case strfinaldigit
Case "1"
Case "2"
Case "3"
Case "4"
Case "5"
Case "6"
Case "7"
Case "8"
Case "9"
Case "A"
Case "B"
Case "C"
Case "D"
Case "E"
Case "F"
End Select

If Not strOffset Is Nothing Then
End If

Case "0001"
Case "0010"
Case "0011"
Case "0100"
Case "0101"
Case "0110"
Case "0111"
Case "1000"
Case "1001"
Case "1010"
Case "1011"
Case "1100"
Case "1101"
Case "1110"
Case "1111"
End Select

strHex = strHexDigit & strFinalDigit
int = 9 + (strHex.Length - 1)
Else
strHex = "7"
int = 9
End If
strHex += Hex(l).Substring(int)
If strHex.Length = 8 And strHex.Substring(0, 1) = "F" Then
strHex = "7" & strHex.Substring(1)
End If
l = Int64.Parse(strHex, Globalization.NumberStyles.HexNumber)

ElseIf Hex(l).Length > 8 Then ' the number is positive

Dim strText As String = Hex(l)
Dim strHex As String
'find out what's in the left-most 32-bit positions. You've already shifted it over, so fill in w/ zeroes

Dim intZero As Integer
Dim strHexDigit As String

'For every four shift bits, you'll have a hex 0; append it to your shift digit
For intZero = 0 To Math.Floor(j / 4) - 1
strHexDigit += "0"
Next
Dim strFinalDigit As String = strText.Substring((Hex(l).Length - 8) + intZero, 1)

'otherwise, put in zeroes in front of the last hex digit
Dim lFinalDigit As Long

Dim intMod As Integer
If j >= 4 Then
intMod = j Mod 4
Else
intMod = j
End If

For intZero = 0 To intMod - 1
strOffset += "0"
Next

Select Case strfinaldigit
Case "1"
Case "2"
Case "3"
Case "4"
Case "5"
Case "6"
Case "7"
Case "8"
Case "9"
Case "A"
Case "B"
Case "C"
Case "D"
Case "E"
Case "F"
End Select

If Not strOffset Is Nothing Then
End If

Case "0001"
Case "0010"
Case "0011"
Case "0100"
Case "0101"
Case "0110"
Case "0111"
Case "1000"
Case "1001"
Case "1010"
Case "1011"
Case "1100"
Case "1101"
Case "1110"
Case "1111"
End Select

'add strHexdigit to the beginning of strFinalDigit
strHex = strHexDigit & strFinalDigit
Dim int As Integer = Hex(l).Length
int = int - (7 - (strHex.Length - 1))

strHex += Hex(l).Substring(int)
l = Int64.Parse(strHex, Globalization.NumberStyles.HexNumber)

End If

Return l

End Function
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary Displaying images in RichTextBox is a common requirement with limited solutions available. Pasting through clipboard or embedding into RTF content only support static images.  This article describes how to insert Windows control objects int…
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
In this episode Don builds upon the troubleshooting techniques by demonstrating how to properly monitor a vSphere deployment to detect problems before they occur. He begins the show using tools found within the vSphere suite as ends the show demonst…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
###### Suggested Courses
Course of the Month7 days, 20 hours left to enroll