C#学习笔记之——二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
此题我第一个想法是把这个数转换成二进制存为字符串,然后通过遍历找有多少个‘1’的方法,后来看到还有很多人有其他的方法,感觉拓展了知识面。
下面是我的最初的方法:
public int NumberOf1(int n)
{
// write code here
int count = 0;//次数
string a = Convert.ToString(n, 2);//转换成二进制数存入一个空字符串
for (int i = 0; i < a.Length; i++) //遍历找有多少个‘1’
{
if (a[i] == '1')
{
count++;
}
}
return count;
}
这里有一个Convert.ToString(),当你在vs里面打的时候你会发现括号里面可以写的很多,可以直接将某种数据转换成string类型,但它还可以是Convert.ToString(int,2)将一个转换成二进制后变为string。这里就讲到string的一个用法了,它实例的对象可以直接用[i]来表示第i个字符。
下面这个方法也是基于转换成二进制存入字符串的情况后,如何找有多少个‘1’。但相对效率比较低。用replace,去掉"1",再比较长度
public int NumberOf1(int n)
{
// write code here
//int count = 0;
string a = Convert.ToString(n, 2);
string r = a.Replace("1", "");
int len = a.Length - r.Length;
return len;
}
下面这个方法也是基于转换成二进制存入字符串的情况后,用正则表达式找
public int NumberOf1(int n)
{
string a = Convert.ToString(n, 2);
Regex rege = new Regex("1", RegexOptions.Compiled);
int count = rege.Matches(a).Count;
return count;
}
用IndexOf和while查找
public int NumberOf1(int n)
{
string a = Convert.ToString(n, 2);
string key = "1";
int index = 0;
int count = 0;
while((index = a.IndexOf(key, index)) != -1)
{
count++;
index = index + key.Length;
}
return count;
}
foreach
public int NumberOf1(int n)
{
int count = 0;
string a = Convert.ToString(n, 2);
foreach (var i in a)
{
if(i.Equals('1'))
{
count++;
}
}
return count;
}
这种操作,很厉害,位的与运算
public int NumberOf1(int n)
{
// write code here
int num = 0;
int s = n;
while (s != 0)
{
s &= (s - 1);
num += 1;
}
return num;
}
还有左移操作的方式
public int NumberOf1(int n)
{
int count = 0;
int flag = 1;
while (flag != 0)
{
if ((n & flag) != 0)
{
count++;
}
flag = flag << 1;
}
return count;
}
再来一个操作
public int NumberOf1(int n)
{
// write code here
int index = 0;
if (n < 0)
{
n = n & 0x7FFFFFFF;
++index;
}
while (n > 0)
{
index += n & 1;
n = n >> 1;
}
return index;
}
如果您看了本篇博客,觉得对您有所收获,请点击右下角的 [推荐]
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
感谢您的阅读,请关注我的后续博客