由于之前一直用windows server 服务器,一直很少接触linux系统了, 最近回顾了一下linux,发现被chmod这个赋权命令的二进制表达是给整懵逼了,只好网上找了下原理,发现太麻烦了,自己研究了一个方法,现整理如下:
怕你们懵逼,先逆向讲一下:
比如:二进制数011是个啥?
首先看得出来它是个三位数,那我们就先排好0到2这三个2的次方,由高到低:
2^2,2^1,2^0
好,操作开始:
二的二次方也就是2^2=4,4*0=0;
2^1=2,1*2=2;
2^0=1,1*1=1。
0+2+1=3
没错二进制数011就是3
但是我们的需求是要将3转成011,这又该怎么办?
没关系,也很简单:
还是老演员:
2^2,2^1,2^0
2^2=4,4>3,那么第一个位置上的数不可取,直接标0,
2^1=2,2<3(1*2<(3-0*4)),但是2*2>3,所以只能是1*2,取1,
2^0=1,1=3-1*2,所以是1*2,直接给1。
这不011就来了。
好同理再来把2变成这样的二进制数:
2^2,2^1,2^0
2^2=4,4>2,那么第一个位置上的数不可取,直接标0,
2^1=2,刚好等于二,那么几乘以2等于2,答案是1,取1,
2^0=1,上面已经取完了,这里就直接给0
所以2=010
由于linux的文件权限最多也就是 111 111 111,即777,所以以上方法够用了。
但如果不限如此非要把8转成二进制,也可以
首先2^2=4,那么我们上2?后面00?
很显然不行二进制只有0和1
那就加一个2的次方:
2^3,2^2,2^1,2^0
这样就能得到1000,
没错8转成二进制就是1000
附:二进制转十进制算法:
private static void MyBinary()
{
Console.WriteLine("请输入您要转成二进制数的十进制数字:");
int i = int.Parse(Console.ReadLine());
int j = 0;
bool b = true;
List<int> list = new List<int>();
list.Add((int)Math.Pow(2, j));
while (b)
{
if (i / (int)Math.Pow(2, j) > 1)
{
j++;
list.Add((int)Math.Pow(2,j ));
}
else
{
break;
}
}
List<int> ints = new List<int>();
int z;
for (int x = list.Count(); x >0; x--)
{
z = i / list.Last();
ints.Add(z);
if (z > 0) { i -= list.Last(); }
list.Remove(list.Last());
}
StringBuilder sb=new StringBuilder();
foreach (var item in ints)
{
sb.Append(item);
}
Console.WriteLine(sb);
}
持续更新中......