Advertisement
milen8204

[C# Basics]Problem16.BitExchange

Mar 16th, 2014
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.71 KB | None | 0 0
  1. using System;
  2. /* Write a program that exchanges bits {p, p+1, …, p+k-1} with bits {q, q+1, …, q+k-1} of a given 32-bit unsigned integer.
  3.  * The first and the second sequence of bits may not overlap. Examples:
  4.  *
  5.  * n            p   q   k   binary representation of n              binary result                           result
  6.  * 1140867093   3   24  3   01000100 00000000 01000000 00010101     01000010 00000000 01000000 00100101     1107312677
  7.  * 4294901775   24  3   3   11111111 11111111 00000000 00001111     11111001 11111111 00000000 00111111     4194238527
  8.  * 2369124121   2   22  10  10001101 00110101 11110111 00011001     01110001 10110101 11111000 11010001     1907751121
  9.  * 987654321    2   8   11  -                                       -                                       overlapping
  10.  * 123456789    26  0   7   -                                       -                                       out of range
  11.  * 33333333333  -1  0   33  -                                       -                                       out of range
  12.  
  13.  */
  14. class AdvancedBitExchange
  15. {
  16.     static void Main()
  17.     {
  18.         long numberN = 0;
  19.         int numberP = 0;
  20.         int numberQ = 0;
  21.         int numberK = 0;
  22.         long mask = 0;
  23.         object resultNum;
  24.  
  25.         do
  26.         {
  27.             Console.WriteLine("Please, enter values n, p, q, k by hitting \"Еnter\" for each :");
  28.  
  29.             if (long.TryParse(Console.ReadLine(), out numberN) && int.TryParse(Console.ReadLine(), out numberP) && int.TryParse(Console.ReadLine(), out numberQ)
  30.                               && int.TryParse(Console.ReadLine(), out numberK))
  31.             {
  32.                 break;
  33.             }
  34.             else
  35.             {
  36.                 Console.WriteLine("You have entered an invalid data. Try again or press \"Cntrl + C\"!");
  37.             }
  38.         } while (true);
  39.        
  40.         // sets how is sinior and How is junior bit.
  41.         if (numberQ < numberP)
  42.         {
  43.             int temp = numberQ;
  44.             numberQ = numberP;
  45.             numberP = temp;
  46.         }
  47.  
  48.         if (numberP < 0 || numberQ < 0 || numberK < 0 || (numberP + numberK) > 32 || (numberQ + numberK) > 32)
  49.         {
  50.             resultNum = "aut of range.";
  51.         }
  52.         else if ((numberQ - numberK) < (numberP + numberK))
  53.         {
  54.             resultNum = "overlapping.";
  55.         }
  56.         else
  57.         {
  58.             Console.Clear();
  59.             Console.WriteLine("number = {0}", numberN);
  60.             Console.WriteLine("binary number = {0}", Convert.ToString(numberN, 2).PadLeft(32, '0'));
  61.             //makes appropriate mask
  62.             string strMask = "";
  63.             for (int i = 0; i < numberK; i++)
  64.             {
  65.                 strMask = strMask + "1";
  66.             }
  67.             mask = Convert.ToUInt32(strMask, 2);
  68.  
  69.             //gets the p+k-1 bits and q+k-1 bits in NumberN
  70.             long bitsPK = numberN & (mask << numberP);
  71.             long bitsQK = numberN & (mask << numberQ);
  72.             //Console.WriteLine("bitsPK {0}", Convert.ToString(bitsPK, 2));
  73.             //Console.WriteLine("bitsQK {0}", Convert.ToString(bitsQK, 2));
  74.             //zeroes p+k-1 and q+k-1 bits in NumberN
  75.             numberN = numberN & (~(mask << numberP));
  76.             numberN = numberN & (~(mask << numberQ));
  77.  
  78.             //sets q+k-1 bits of position p+k-1
  79.             bitsPK = bitsPK << numberQ - numberP;
  80.  
  81.             //sets p+k-1 bits of position q+k-1
  82.             bitsQK = bitsQK >> numberQ - numberP;
  83.  
  84.             //changes values of bits p+k-1 and q+k-1
  85.  
  86.             resultNum = numberN | bitsPK | bitsQK;
  87.             Console.WriteLine("binary result = {0}", Convert.ToString((long)resultNum, 2).PadLeft(32, '0')); //prints buinary result
  88.         }
  89.  
  90.         Console.WriteLine("result = {0}", resultNum);
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement