Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

velio84 avatar velio84 241 Точки

[Homework] C# Basics - Operators, Expressions, Statements - Problem {15*} - Bits Exchange

Здравейте,

имам малък (или не толкова) проблем въпросната задача. Ето го условието:

Write a program that exchanges bits 3, 4 and 5 with bits 24, 25 and 26 of given 32-bit unsigned integer.

Ето го и кода, за да не ми гоните логиката (която може и да липсва в случая laughing) съм вкарал коментари кое какво прави:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _03_15_BitsExchange
{
    class BitsExchange
    {
        static void Main(string[] args)
        {
            uint n, l, s, x, y, i;
            Console.Write("Enter an integer number: ");
            n = uint.Parse(Console.ReadLine());

            //s записва стойността на битове 3,4,5 като ги измества на позиции 0,1,2 и след това ги сравнява с логическо "И" с числото 7 (в двоичен вид 111)
            s = n >> 3;
            s = s & 7;

            //l записва стойността на битове 24,25,26 като ги измества на позиции 0,1,2 и след това ги сравнява с логическо "И" с числото 7 (в двоичен вид 111)
            l = n >> 24;
            l = l & 7;

            //x измества битовете записани от позиции 3,4,5 на позиции 24,25,26 в ново число
            x = s << 24;


            //y измества битовете записани от позиции 24,25,26 на позиции 3,4,5 в ново число
            y = l << 3;

            //ново число i, което държи разменените позиции на битовете 3,4,5 и 24,25,26
            i = x | y;


            //n = ? тук искам по някакъв начин да навържа i и n, за да получа новото число с разменени битове, но не ми се получава... :)

            Console.WriteLine(n);
                                   
        }
    }
}

 

Въпроса ми е: има ли шанс програмата да заработи така написана и както се вижда, ако предполжим, че е вярно написано всичко, не мога да се справя с последия логически израз - как да сравня i и n, за да получа ново n с разменени битове.

Всякаква помощ ще ми е от ползва smile

Тагове:
2
Programming Basics
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Логиката ти е правилна, накрая ти остава само да размениш битовете на съответните позиции, което те е затруднило. Идеята е цифрата 7 (111) да я преместиш първо с 3 позиции в ляво, да използваш !, за да обърнеш 111 в 000, а всички 0-ли в 1-ци. Следва логическо & (И) на n с получения израз от предното изречение. Цялата тази поредица от битови операции досега ти преобразува съответните битове 3, 4 и 5 от n в 0-ли. Накрая остава само логическо ИЛИ между n и i, което си получил като маска на битове 24, 25 и 26. Аналогичните побитови операции ги правиш и за другите битове 24, 25 и 26 на n. Може да разгледаш и моето решение: 

15. BitsExchange

Edit: понеже преместих всичките си проекти в github в нова папка SoftUni голяма част от старите ми постове ще са с невалиден линк към github профила ми. Затова отворете GitHub профила ми и намерете каквото ви е необходимо:

GitHub

6
27/01/2015 22:59:10
velio84 avatar velio84 241 Точки

Благодаря много, оправих я програмата и вече работи :)

Решението ти е екстра - много изчистено и нагледно.

1
Ifandieva avatar Ifandieva 71 Точки

Отдавна сте писали всичко тук и решението на nikola.m.nikolov вече го няма в линка. Някакъв шанс все пак да го видя, че с е справям с побитовите задачи преди тази в третото домашно от C# Basics, но тук вече удрям на камък. Видях решение надолу, но ми се иска да видя варианти, това учи много.

 

 

0
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Ifandieva, понеже правих рефакториране в github и преместих всичките си проекти в папка Softuni, трябваше да редактирам всичките си постове във форума, което е малко трудоемко. В профила ми в GitHub всичко е добре подредено, така че няма да имаш проблем да го намериш:

GitHub

1
27/01/2015 22:54:13
zutobg avatar zutobg 21 Точки

Ето и моя вариант, използвам for за да обходя необходимия брой позиции на битовете, записвам ги в 2 темпорари стойности и ако са различни им разменям стойностите с ^

http://pastebin.com/V6XNkeQi

3
29/10/2014 00:26:37
pataroka avatar pataroka 319 Точки

Аз направо реших да маскирам позициите с числата, в които само на тези позиции има единици. Малко употреба на функционалността на Уин калкулатора :)

 

https://dotnetfiddle.net/Nwwv2n

0
29/11/2014 17:18:54
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.