6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
1

Побитовые операции - сдвиг

13.02.2016, 00:51. Показов 1353. Ответов 13
Метки нет (Все метки)

Вот код. Объясните пожалуйста,почему так ведёт себя последний цикл. Как-то он странно сдвигает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * Created by SharpDevelop.
 * User: User
 * Date: 12.02.2016
 * Time: 21:05
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
 
namespace Bit
{
    class Program
    {
        public static void Main(string[] args)
        {
            int a,b,i,count=0,h;
            int [] m = new int[40];
            
            a=Convert.ToInt32(Console.ReadLine());
            Array.Resize(ref m,10);
            b=a;
            h=a;
            while (b!=0)
            {
                b/=2;
                count++;
            }
            Array.Resize(ref m,count);
            for (i=0;i<m.Length;i++)
            {
                if ((a%2==0)&(a>0))
                {
                    m[i]=a%2;
                    a/=2;
                }
                else if((a%2!=0)&(a>0))
                {
                    m[i]=1;
                    a/=2;
                }
            }
            for (i=0;i<m.Length;i++)
                Console.Write(m[m.Length-i-1]);
            Console.WriteLine();
            a=h;
            b=a<<1;
            Console.WriteLine(b);
            Console.WriteLine();
            for (i=0;i<m.Length;i++)
            {
                if ((b%2==0)&(b>0))
                {
                    m[i]=b%2;
                    b/=2;
                }
                else if((b%2!=0)&(b>0))
                {
                    m[i]=1;
                    b/=2;
                }
            }
            for (i=0;i<m.Length;i++)
                Console.Write(m[m.Length-i-1]);
            Console.WriteLine();
            b=a<<2;
            
            for (i=0;i<m.Length;i++)
            {
                if ((b%2==0)&(b>0))
                {
                    m[i]=b%2;
                    b/=2;
                }
                else if((b%2!=0)&(b>0))
                {
                    m[i]=1;
                    b/=2;
                }
            }
            for (i=0;i<m.Length;i++)
                Console.Write(m[m.Length-i-1]);
            Console.WriteLine();
            b=a>>1;
            
            for (i=0;i<m.Length;i++)
            {
                if ((b%2==0)&(b>0))
                {
                    m[i]=b%2;
                    b/=2;
                }
                else if((b%2!=0)&(b>0))
                {
                    m[i]=1;
                    b/=2;
                }
            }
            for (i=0;i<m.Length;i++)
                Console.Write(m[m.Length-i-1]);
            Console.WriteLine();
            
            // TODO: Implement Functionality Here
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2016, 00:51
Ответы с готовыми решениями:

Побитовые операции
Нужна помощь. впервые встречаюсь с побитовыми операциями. задания для меня, как минимум, непонятны....

Побитовые операции
Для двух символов реализовать операцию «И» два правых байт, получив таким образом значение для...

Побитовые операции с double
Нашел на msdn Почему так? А если мне надо побитово что-то с ним сделать? BitConverter'ом...

Логические побитовые операции
Привет изучаю как работают логические операции а именно (XOR) Вот написал програмку которая...

13
1140 / 732 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
13.02.2016, 01:34 2
Где именно, я что-то ни в одном цикле сдвигов не вижу, а последний так вообще просто вывод в консоль.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
13.02.2016, 02:15 3
я могу предположить что
C#
1
b/=2;
он считает сдвигом
C#
1
b >>= 1;
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
13.02.2016, 09:56  [ТС] 4
IchimaruGin, я в двоичную переводил,чтобы посмотреть,как он сдвинул,если с первыми сдвигами,вроде,всё понятно и правильно,то с последним нет.
0
1937 / 1762 / 824
Регистрация: 23.01.2014
Сообщений: 6,207
13.02.2016, 10:56 5
Цитата Сообщение от NewNoob Посмотреть сообщение
Объясните пожалуйста,почему так ведёт себя последний цикл. Как-то он странно сдвигает.
Цитата Сообщение от NewNoob Посмотреть сообщение
если с первыми сдвигами,вроде,всё понятно и правильно,то с последним нет.
Вы хотя бы опишите в двух словах что там происходит. Сколько там циклов, что каждый из них делает, что именно не понятно, какой результат работы, какой результат Вы ожидали...
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
13.02.2016, 20:15  [ТС] 6
pav1uxa, так итак понятно. Перевожу число в двоичное. Сдвигаю в десятичном. Смотрю,как изменилось в двоичном после сдвига и как в десятичном. По-моему,там итак понятно.
0
1140 / 732 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
13.02.2016, 21:14 7
Цитата Сообщение от NewNoob Посмотреть сообщение
Сдвигаю в десятичном
Побитовый сдвиг потому и называется, что сдвигает биты, т.е. двоичное представление числа.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
 
namespace Bit
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.Write("a = ");
            int a = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("{0} ({1})\n", Convert.ToString(a, 2), a);
            
            int b = a << 1;
            Console.WriteLine("a << 1");
            Console.WriteLine("{0} ({1})\n", Convert.ToString(b, 2), b);
 
            b = a << 2;
            Console.WriteLine("a << 2");
            Console.WriteLine("{0} ({1})\n", Convert.ToString(b, 2), b);
 
            b = a >> 1;
            Console.WriteLine("a >> 1");
            Console.WriteLine("{0} ({1})\n", Convert.ToString(b, 2), b);
 
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

Не по теме:

Цитата Сообщение от NewNoob Посмотреть сообщение
По-моему,там итак понятно
Ну это вы зря, какие-то ресайзы массивов, все переменные именованы в одну букву, куча копипаста.

0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
13.02.2016, 22:54  [ТС] 8
Lexeq, да я итак это знаю. Почему последний сдвигается странно? В двоичном он единицы добавляет.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
14.02.2016, 00:37 9
может b отрицательное число а при сдвиге вправо отрицательного числа с левого края получаются единицы, ну флаг знака сохраняется.
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
14.02.2016, 11:46  [ТС] 10
IchimaruGin, короче,возьмём число 5. - 101. на 1 сдвинем влево - 10. В двоичной - 010. Теперь на 2 сдвину влево первоначальное число - 100. Вправо сдвигаю - получается 110. Как так? Отрицательных чисел там нету.

Добавлено через 3 минуты
IchimaruGin, мда,понял,короче. Т.е сдвинуть равносильно тому,чтобы умножить при сдвиге влево на число сдвигов число и разделить на число вправо число. 5 нацело не делится,поэтому у меня фиг знает что и выводилось. А почему он в двоичной не считает-то?
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
14.02.2016, 12:08 11
Цитата Сообщение от NewNoob Посмотреть сообщение
А почему он в двоичной не считает-то?
я вопрос непонимаю...
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
14.02.2016, 18:28  [ТС] 12
IchimaruGin, 5 - 101. 5<<1 - 110 Выводит 5<<1 - 2.5. Должно быть 010 - 2 Если б в двоичной считал,было бы лучше. А какова цель этих операций в программировании.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
14.02.2016, 18:38 13
Цитата Сообщение от NewNoob Посмотреть сообщение
5 - 101. 5<<1 - 110 Выводит 5<<1 - 2.5. Должно быть 010 - 2
00000101 - 5
00001010 = 5 << 1 = 10
00000010 - 5 >> 1 = 2
Цитата Сообщение от NewNoob Посмотреть сообщение
А какова цель этих операций в программировании.
ну можна применять например для шифрования данных
1
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
14.02.2016, 19:17  [ТС] 14
IchimaruGin, извиняюсь,выводит 2. Но в двоичной пишет 110. Код перевода в двоичную,наверное,надо допиливать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2016, 19:17

Побитовые операции с целыми числами
Есть две переменные a и b. Обе задаются значениями в диапазоне включительно. Возможно ли какими...

Задача на побитовые операции. Расчёт премий сотрудникам
Добрый день, помогите пожалуйста решить задачу. Задача именно на ПОБИТОВЫЕ операции... Напишите...

побитовые операции
кто сможет помоч с решением: преобразовать беззнаковое целое число по следующему закону:первый и...

Побитовые операции: как работает этот сдвиг вправо и логическое "И"(&) ?
в этой функции перевожу в двоичную с/с но не могу понять как работает этот сдвиг вправо и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.