这种运算怎么计算,位运算。

Lucenedonet 2013-05-27 04:25:04
1 2 4 8 16 这种数 根据某几个的和怎么推出是那几个
比如11 就是 1 2 8

24 就是8 和 16

写一个函数,接收和,输出是那几个
...全文
265 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dhy3610 2013-06-03
  • 打赏
  • 举报
回复
这个规律很明显 相加之和都是2的幂
cheng2005 2013-06-03
  • 打赏
  • 举报
回复
        public List<int> func(int input)
        {
            List<int> result = new List<int>();

            int m = 1;

            for (int i = 0; i < 31; i++)
            {
                if ((input & m) == m)
                    result.Add(m);

                m = m << 1;
            }

            return result;
        }
看了楼上的回帖我真觉得C#被别人诟病,被别人瞧不起都是有道理的。好像搞C#的大多数人都缺少编程的基础思维和基础知识。
wxl1010 2013-05-28
  • 打赏
  • 举报
回复


public List<int> XXXX(int sum){
    List<int> ret = new List<int>();
    for(int i=1;Math.Pow(2, i)<=sum,i++){
         int _i = Math.Pow(2, i);
         if((sum&_i)==_i){
             ret.add(_i);
         }
    }
    return ret;
}
代码可能有错,手写的。大概思路应该没有错吧!
喂大的程序员 2013-05-28
  • 打赏
  • 举报
回复
引用 13 楼 blue_apple2006 的回复:
用移位计算速度比较快。
 class Program
    {
        static void Main(string[] args)
        {
            for (; ; )
            {
                int input = int.Parse(Console.ReadLine());

                for (int i = 0; i <= 32; i++)
                {
                    if ((input & 0x1) == 0x1)
                    {
                        Console.WriteLine(Math.Pow(2, i));
                    }

                    input >>= 1;
                }
            }
        }
    }
学习了
blue_apple2006 2013-05-28
  • 打赏
  • 举报
回复
引用 14 楼 hdt 的回复:
其实表查询最快
大哥,表查询怎么可能有移位快呢?移位是寄存器指令操作,比加法运算快几倍的速度。
真相重于对错 2013-05-28
  • 打赏
  • 举报
回复
其实表查询最快
blue_apple2006 2013-05-28
  • 打赏
  • 举报
回复
用移位计算速度比较快。
 class Program
    {
        static void Main(string[] args)
        {
            for (; ; )
            {
                int input = int.Parse(Console.ReadLine());

                for (int i = 0; i <= 32; i++)
                {
                    if ((input & 0x1) == 0x1)
                    {
                        Console.WriteLine(Math.Pow(2, i));
                    }

                    input >>= 1;
                }
            }
        }
    }
md5e 2013-05-28
  • 打赏
  • 举报
回复
优化一下,还可以这样 int n = 99; string s = string.Empty; while (n > 0) { string d = toN36(n, 2); int c=Convert.ToInt32(Math.Pow(2, d.Length - 1)); s=s+ c +"+"; n = n - c; } Response.Write(s.TrimEnd('+')); Response.End();
md5e 2013-05-27
  • 打赏
  • 举报
回复
所有数字都可以转为二进制输出,就是所谓的1010101 int n = 24; Int64 d = Int64.Parse(toN36(n, 2)); string s = string.Empty; while (d > 0) { s = s + toN10(Math.Pow(10, d.ToString().Length - 1).ToString(), 2).ToString() + "+"; d = d - (Int64)Math.Pow(10, d.ToString().Length - 1); } Response.Write(s.TrimEnd('+')); Response.End(); /// <summary> /// 36进制内的数值转10进制 /// </summary> /// <param name="radixnum"></param> /// <param name="radix"></param> /// <returns></returns> public int toN10(string radixnum, int radix) { string _num = "0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZ"; char[] _ary = radixnum.ToCharArray(); int _log = 1; int sn = 0; for (int i = _ary.Length - 1; i >= 0; i--) { sn = sn + _num.IndexOf(_ary[i]) * _log; _log = _log * radix; } return sn; } /// <summary> /// 10进制转36进制 /// </summary> /// <param name="n10"></param> /// <param name="radix"></param> /// <returns></returns> private string toN36(int n10, int radix) { string _num = "0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZ"; int sn = n10; string _rul = string.Empty; while (sn >= radix) { _rul = _num.Substring(sn % radix, 1) + _rul; sn = sn / radix; } return _num.Substring(sn % radix, 1) + _rul; }
Lucenedonet 2013-05-27
  • 打赏
  • 举报
回复
引用 9 楼 liuchaolin 的回复:
public double get2NPow(int n) { return Math.Pow(2, n - 1); } public int get2NSqrt(double n) { int i = 1; while (n > 1) { n = n / 2; i++; } return i; }
这不是我的意思吧。 我输入24返回8,16, 输入11,返回1,2,8
md5e 2013-05-27
  • 打赏
  • 举报
回复
public double get2NPow(int n) { return Math.Pow(2, n - 1); } public int get2NSqrt(double n) { int i = 1; while (n > 1) { n = n / 2; i++; } return i; }
Lucenedonet 2013-05-27
  • 打赏
  • 举报
回复
引用 6 楼 liuchaolin 的回复:
明明就是2的第几次方
高人,这个函数怎么写啊。
md5e 2013-05-27
  • 打赏
  • 举报
回复
2^0=1,2^1=2,2^2=4,2^3=8,2^4=16,2^5=32
md5e 2013-05-27
  • 打赏
  • 举报
回复
明明就是2的第几次方
Lucenedonet 2013-05-27
  • 打赏
  • 举报
回复
引用 3 楼 hu_hujun 的回复:
怎没有规律啊, 1 2 4 8 16 32 都是2的整数次幂
那你的24 是8和16 怎么算的 不也是8+16 要是2的次幂 也是2 2 2 2 2才对啊[/quote] 你连我的意思都没懂? 24只能是8和16的和,不可能是其他数的和。所以输入24能惟一确定8 16 输入11能为已确定8 2 1 1 2 4 8 16 这种数 仔细看下题。
hu_hujun 2013-05-27
  • 打赏
  • 举报
回复
引用 3 楼 hu_hujun 的回复:
怎没有规律啊, 1 2 4 8 16 32 都是2的整数次幂
那你的24 是8和16 怎么算的 不也是8+16 应该是 2 2 2 3
hu_hujun 2013-05-27
  • 打赏
  • 举报
回复
怎没有规律啊, 1 2 4 8 16 32 都是2的整数次幂[/quote] 那你的24 是8和16 怎么算的 不也是8+16 要是2的次幂 也是2 2 2 2 2才对啊
Lucenedonet 2013-05-27
  • 打赏
  • 举报
回复
引用 1 楼 hu_hujun 的回复:
这个都没有规律 怎么推算
怎没有规律啊, 1 2 4 8 16 32 都是2的整数次幂
hu_hujun 2013-05-27
  • 打赏
  • 举报
回复
这个都没有规律 怎么推算

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧