【问题标题】:Excel Formula convert to C#Excel 公式转换为 C#
【发布时间】:2012-01-26 18:46:11
【问题描述】:

我是 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();

【问题讨论】:

  • 你的问题到底是什么?
  • @Ramhound 我相信这是“如果有人有任何指示......”。你应该尝试阅读,它很有用。
  • @BrianGraham - 我觉得要求模糊的指针不是一个有效的 SO 问题。他不解释他不明白的事情。他所要做的就是执行操作的顺序。他可以跳过 INT 方法。他甚至没有提供完整的样本。
  • 如果有帮助,我已经更新...不确定为什么数字不正确,但开始了解位运算符语法

标签: c# excel formula


【解决方案1】:

由于您在 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)

&gt;&gt; 表示“向右移动(二进制表示)”; &lt;&lt; 表示“向左移动(二进制表示)”。移位1相当于乘以或除以2,就像移位十进制数相当于乘以或除以10。

&amp; 表示按位AND。 255 是最后八位设置为 1 的数字;与它进行与运算会保留原始数字的最后八位。

编辑:这是您的重写的更正版本,它返回正确的结果:

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);

【讨论】:

  • 那是因为你使用A1修改后。我添加A0 表示“原始A1”,请参阅答案的编辑。
【解决方案2】:

对我来说看起来像是一些基于常量和操作的位操作。在 C# 中,您应该简单地使用按位“与”(&amp;)、“或”(|)和移位(&lt;&lt;&gt;&gt;)来做到这一点。

【讨论】:

    【解决方案3】:

    据我所知,这应该会有所帮助,

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

    等价于

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

    您应该能够使用它来派生其他 3 个组件。

    【讨论】:

    • 使用上面的得到 50331648
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2017-08-29
    • 2022-07-06
    相关资源
    最近更新 更多