Проблем с битове


0

Здравейте, някой може ли да ми каже защо кода ми работи с първия примерен вход, а със следващите два не работи. И какво би трябвало да рече , да не се застъпват двете поредици. Благодаря.

Условие:

  • 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.
  • The first and the second sequence of bits may not overlap.

Входове:

npqkbinary representation of nbinary resultresult
1140867093324301000100 00000000 01000000 0001010101000010 00000000 01000000 001001011107312677
4294901775243311111111 11111111 00000000 0000111111111001 11111111 00000000 001111114194238527
23691241212221010001101 00110101 11110111 0001100101110001 10110101 11111000 110100011907751121
/* Problem 16.** Bit Exchange (Advanced) 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. The first and the second sequence of bits may not overlap. */ namespace BitsExchangeAdvanced { using System; public class AdvancedBitsExchange { public static void Main() { Console.Write("Number: "); uint number = uint.Parse(Console.ReadLine()); Console.Write("P: "); int p = int.Parse(Console.ReadLine()); Console.Write("Q: "); int q = int.Parse(Console.ReadLine()); Console.Write("K: "); int k = int.Parse(Console.ReadLine()); uint[] bits = GetBitsAsArray(number); SwapBits(ref bits, p, q, k); int resultNumber = GetNumberFromBitsArray(bits); Console.WriteLine($"Result: {resultNumber}"); } private static uint[] GetBitsAsArray(uint number) { uint[] bits = new uint[32]; for (int i = bits.Length - 1; i >= 0; i--) { bits[i] = (number >> i) & 1; } return bits; } private static int GetNumberFromBitsArray(uint[] bits) { Array.Reverse(bits); string binaryString = string.Join(string.Empty, bits); int number = Convert.ToInt32(binaryString, 2); return number; } private static void SwapBits(ref uint[] bits, int p, int q, int k) { Swap(ref bits[p], ref bits[q]); Swap(ref bits[p + 1], ref bits[q + 1]); Swap(ref bits[p + k - 1], ref bits[q + k - 1]); } private static void Swap(ref uint a, ref uint b) { a ^= b; b ^= a; a ^= b; } } }



Отговори



0

private static void SwapBits(ref uint[] bits, int p, int q, int k)

{

   for (int i = 0; i<k; i++) Swap(ref bits[p + i], ref bits[q+i]);

}

Проблемът при теб е, че сменяш само 3 бита, а в условието пише, че трябва да смениш от p до p+k-1 битовете. Това означава, че броят битове, които трябва да смениш е K на брой, а не точно 3. Странно е защо първият тест ти работи, а вторият не, при положение, че са едни и същи, но не мога да тествам в момента. Друго нещо, което ще ти препоръчам е да не ползваш uint array, за да държиш нули и единици, защото хабиш прекалено много излишно място. Convert.ToString(number, 2) ще ти свърши работа за прехвърляне в двойчна бройна система. :)


от hrist0.stoichev (1121 точки)


0
Ясно. Благодаря.