Guest User

Problem 16.** Bit Exchange (Advanced)

a guest
Mar 22nd, 2014
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.50 KB | None | 0 0
  1. namespace _16.BitExchange_Advanced_
  2. {
  3.     using System;
  4.     class Program
  5.     {
  6.         static void Main()
  7.         {
  8.             Console.Write("Enter n : ");
  9.             long n = long.Parse(Console.ReadLine());
  10.             Console.Write("Enter p : ");
  11.             sbyte p = sbyte.Parse(Console.ReadLine());
  12.             Console.Write("Enter q : ");
  13.             sbyte q = sbyte.Parse(Console.ReadLine());
  14.             Console.Write("Enter k : ");
  15.             sbyte k = sbyte.Parse(Console.ReadLine());
  16.  
  17.             if ((p + k > 32) || (q + k > 32) || p < 0 || q < 0)
  18.             {
  19.                 Console.WriteLine("Out of range!");
  20.                 return;
  21.             }
  22.             if (Math.Min(p, q) + k >= Math.Max(p, q))
  23.             {
  24.                 Console.WriteLine("Overlapping!");
  25.                 return;
  26.             }
  27.             int mask1 = 0;
  28.             for (int i = 0; i < k; i++)
  29.             {
  30.                 mask1 = mask1 * 2 + 1;
  31.             }
  32.             int mask2 = mask1;
  33.             mask1 = mask1 << p;
  34.             mask2 = mask2 << q;
  35.             long gettingFirstBits = ((Math.Min(p, q) == p ? mask1 : mask2) & n) << Math.Max(p, q) - Math.Min(p, q);
  36.             long gettingSecondBits = ((Math.Max(p, q) == p ? mask1 : mask2) & n) >> Math.Max(p, q) - Math.Min(p, q);
  37.  
  38.             long mask3 = ~mask1 & n;
  39.             long mask4 = ~mask2 & n;
  40.             n = (gettingFirstBits | gettingSecondBits) | (mask3 & mask4);
  41.             Console.WriteLine(n);
  42.         }
  43.     }
  44. }
Advertisement
Add Comment
Please, Sign In to add comment