在linux下代码实现ls -l 命令(利用移位 和 与 操作 对指定位的分离 )(指定位段的分离)

在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寄存器时才看到的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值