Бихте ли ми разяснили условието на домашното Bit Swap?


1

Здравейте, приятели! Пише, че от въведените числа p, q, k да се определят битовете за разменяне: {p, p+1, …, p+k-1} with bits {q, q+1, …, q+k-1}  Въпросът ми е,  общо 6 бита ли трябва да сменя ( p, p+1, p+k-1; q, q+1, q+k-1), или това са два интервала с битове? 




Отговори



1
Това са интервали от битове, на които трябва да смениш местата.
Пример:
k = 5
p = 1
q =10
т.е. бит на позиции 1,2,3,4,5 трябва да бъдат разменени с битове на позиции 10,11,12,13,14
друг пример:
k = 3 
p = 2
q = 15
трябва да размениш битове на позиции 2,3,4 с битовете на 15,16,17
Надявам се да съм помогнал. 

от StoikoNeykov (2621 точки)


1
Благодаря! Интересно, че само като въртя 6те си бита, ми прави 40% от задачата според бгкодър.

от dahaca (90 точки)

0
при положение, че е само единици и нули при по малки интервали може да е на късмет :D 
или логиката ти да "покрива" част от случаите - случва се. 

от StoikoNeykov (2621 точки)


1
Това са ти интервалите. :) 

от kiko0o7 (472 точки)


1
Мерси! Продължавам да работя!

от dahaca (90 точки)


0

имаш две поредици от числа:

1-ва поредица: p, p+1, p+2p+3  …, p+k-1

2-ра поредица: q, q+1p+2p+3 …, q+k-1

Пример:

При p=5, q=8, k=3 и заместване в горните изрази получаваш следните поредици като резултат:

1-ва поредица: 5, 5+1, 5+2-1 или 5, 6, 7

2-ра поредица: 8, 8+1, 8+2-1 или 8, 9, 10

Задачата е да смениш местата на битовете на позициите от 1-ва поредица с тези от 2-ра поредица.


от martinboykov (1112 точки)


1
При k = 2 редицата от числа има два члена. k е броят на членовете в редицата. Не е вярно това, което си написал. :)

от irrealizable (356 точки)

0
прав си....коригирано.

от martinboykov (1112 точки)


3
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Т3._15.BitSwapV2 { class Program { static void Main(string[] args) { uint number = UInt32.Parse(Console.ReadLine()), mask1, mask2; int p, m, q, n, k; p = int.Parse(Console.ReadLine()); q = int.Parse(Console.ReadLine()); k = int.Parse(Console.ReadLine()); for (m=p,n=q; (m <= p+k-1) && ( n<= q + k - 1); n++,m++) { mask1 = number >> m; mask1 = mask1 & 1; mask2 = number >> n; mask2 = mask2 & 1; if( mask1 != mask2) { mask1 = (uint)1 << m; number = mask1 ^ number; mask2 = (uint)1 << n; number = mask2 ^ number; } } Console.WriteLine(number); } } }
Ето го кода ми. 100/100 на бгкодър! Благодаря на всички за помощта! <3

от dahaca (90 точки)