在linux下代码实现ls -l 命令
这里重要的是利用移位 和 与 操作 对指定位的分离
我们对要对变量中指定位赋值为1比如对32位中的 第7位赋值为1 我们可以这样 int a = 0x40;但是现在又要补充对对15位进行赋值呢??该怎么做?与0x4000进行或运算,
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
char power[]="0rwxrwxrwx";
struct stat st;
int i = 0,j,temp,movbit=0x100;//二进制的第9位为1 后面每次右移位 //我们的思想是每次移动一位,其实还可以每次3位3位的移动因为rwx重复了3次每次3位移动的类似于 一位一位的移动
i = argc > 1 ? 1 : 0; //无参数则默认参数为自己
while(i++ < argc)
{
stat(argv[i-1],&st);
switch(st.st_mode & S_IFMT)//是什么文件就显示出什么
{
case S_IFDIR : printf("Dir ");break;//目录
case S_IFBLK : printf("BLO ");break;//块文件
case S_IFCHR : printf("CHR ");break;//特殊字符文件
case S_IFREG : printf("REG ");break;//普通文件
case S_IFIFO : printf("IFO ");break;//管道文件
default : printf("Unkown ");//未知文件
}
temp = st.st_mode & 0x1ff;//这里得到文件的权限 2进制的9位数
for(j = 1;j<=10;j++)
{
movbit & temp ? putchar(power[j]) : putchar('-');//检测相对应的位上是否为真 有权限则输出无则输出"-"
movbit >>= 1;//第9位的1依次向右移动
}
printf("\t%d",st.st_nlink);
printf("\t%ld",st.st_size);
printf("\t%.24s",ctime( &st.st_atime ));
printf("\t%s",argv[i-1]);
putchar('\n');
}
return 0;
}
// ubuntu 10.04 下测试通过
今天在做消息队列的时候看到消息类型 的种类可能会有很多种,定义多个变量每个变量又只用一小部分,岂不是很浪费,于是想对一个变量进行分割。不同的部分表示不同的意思,例如01001 1001 1100 1101 我们可以用第0到8位表示id号,9-11表示消息的其他属性,于是乎封装了个将指定位分离的程序(还有种思路是将这个变量先右移再左移动就像挤掉两边没用的东西剩下的就是想要的只需2步)
typedef long Datatype;
Datatype databitget(Datatype source,int begin,int end)// 取begin到end的位的数32位机这是0到31位 无视顺序
{
int temp;
Datatype seg = 0,atemp = 1;
int i=0;
// 最大最小范围超标
if(begin < 0 || end < 0 || ( begin > end ? begin : end) >= 8 * sizeof(source) ){
return -1;
}
if(begin > end){
temp = begin;
begin = end;
end = temp;
}
for (i = 1;i <= end - begin + 1;i++){
seg = (seg<<1) | (0x1);
}
seg <<= begin;//移位完成
return (source & seg) >>begin;
}
int main()
{
int dest=0;
// sour = 10,0010,1001(二进制);
long sour =0x229;(上面对应的十进制)
dest = databitget(sour,2,5);//应该是1010
printf("%x\n",dest);
return 0;
}
利用联合体中镶如结构体 ,内存拷贝,也能取得里面的指定字节,利用字符指针(空指针)可取指定字节再小得恐怕只有上面的方法了,
再来一种方法:比如提取第3到7位 一共5位则
unsigned int m = 0;
m &= (31>>5);//结果的m就是要求的值.这是在学习ARM寄存器时才看到的.