Excel Formula преобразовать в C # - PullRequest
0 голосов
/ 26 января 2012

Я новичок в c #, но пытаюсь запустить эту формулу из WPF.

=(BIN2DEC(RIGHT(DEC2BIN(MOD(INT(A1/16777216), 256),8), 3)) * 16777216) + (MOD(INT(A1/65536), 256) * 65536) + (MOD(INT(A1/256), 256) * 256) + MOD(A1,256) 

начал пробовать и работать, но думаю, что я даже не близко ... если у кого-то есть какие-то указатели .....

decimal A1 = Convert.ToInt32(textBox1.Text);
A1 = (A1 / 16777216);
A1 = decimal.Truncate(A1);
A1 = decimal.Remainder(Left, Right);
Convert.ToByte(A1);
String Number = A1.ToString();
Number.Reverse();
Number.Remove(3);
Number.Reverse();
A1 = Convert.ToByte(Number);

и так далее ...

----------------- ОБНОВЛЕНИЕ ----------------------------------

Извините, если мне понятнее, я пытаюсь этого добиться ..

32-разрядное число должно переводиться в 8 или 9-значное (27-разрядное двоичное) число.Если будет получено десятичное число из 9 цифр, вам нужно будет отбросить самую значимую десятичную цифру, чтобы показать желаемое число.

Примеры: 467597668 преобразуется в 64944484

705313524 преобразуется в 34224884

4294967295 преобразуется в 134217727

Я сейчас пытаюсь, но получаю неправильное число?


        int A1 = Convert.ToInt32(textBox1.Text);
        A1 /= 16777216;
        A1 &= 7; 
        A1 *= 16777216;
        int A2 = (((A1 >> 16) & 255) << 16);
        int A3 = (((A1 >> 8) & 255) << 8);
        int A4 = (A1 & 255);
        textBox2.Text = (A1+A2+A3+A4).ToString();

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Поскольку у вас есть красивые целочисленные типы и битовые операции в C #, вам не нужно переходить через те же циклы, что и в Excel.

Вот как вы конвертируете начальную часть (BIN2DEC(RIGHT(DEC2BIN(MOD(INT(A1/16777216), 256),8), 3)) * 16777216):

int A1 = Convert.ToInt32(textBox1.Text);
A1 /= 16777216; // This also truncates the result; INT(A1/16777216)
A1 &= 7; // This takes the last three bits of the number: BIN2DEC(RIGHT(DEC2BIN(MOD(A1,8),3))
A1 *= 16777216; // A1 * 16777216

(MOD(INT(A1/65536), 256) * 65536), (MOD(INT(A1/256), 256) * 256) и MOD(A1,256) еще проще:

(((A1 >> 16) & 255) << 16)
(((A1 >> 8) & 255) << 8)
(A1 & 255)

>> означает «сдвиг (двоичное представление) вправо»; << означает «сдвиг (двоичное представление) влево». Сдвиг на один эквивалентен умножению или делению на два таким же образом, как смещение десятичного числа эквивалентно умножению или делению на десять.

& означает побитовое AND. 255 - число с последними восемью битами, установленными в единицу; И с ним сохраняются последние восемь бит исходного числа.

РЕДАКТИРОВАТЬ : Вот исправленная версия вашего переписывания, которая возвращает правильный результат:

int A0 = 467597668;
int A1 = A0 / 16777216;
A1 &= 7;
A1 *= 16777216;
int A2 = (((A0 >> 16) & 255) << 16);
int A3 = (((A0 >> 8) & 255) << 8);
int A4 = (A0 & 255);
Console.WriteLine(A1 + A2 + A3 + A4);
0 голосов
/ 26 января 2012

Это должно помочь, насколько я понимаю,

RIGHT(DEC2BIN(MOD(INT(A1/16777216), 256),8), 3)) * 16777216

эквивалентно

(((a1 / 16777216) % 256) & 7) * 16777216

Вы должны быть в состоянии использовать это для получения других 3 компонентов.

0 голосов
/ 26 января 2012

Похоже, мне нужно несколько битовых операций, основанных на константах и ​​операциях. В C # вы должны просто использовать побитовое "и" (&), "или" (|) и сдвиги (<<, >>), чтобы сделать это.

...