C语言——位操作

C语言——位操作


宗旨:技术的学习是有限的,分享的精神是无限的。


一、基本位操作

|

&

~

取反

^

异或

<< 

左移

>> 

右移

 

二、位操作的常见用法

1.获取某位的值

#define BitGet(Number,pos)  ((Number)|= 1<<(pos))   //把某位置1 
#define  BitGet(Number,pos)  ((Number) &= ~(1<<(pos)) //把某位置0
#define  BitGet(Number,pos)  ((Number) >> (pos)&1)) //用宏得到某数的某位
#define  BitGet(Number,pos)  ((Number) ^= 1<<(pos)) //把Number的POS位取反

 

2.设定某位的值(设为01) --- 实际应用中用的比较多的

方法一:

#define setbit(x,y)  x|=(1<<y)   //将x的第y位置1 

#define clrbit(x,y)  x&=~(1<<y) //将x的第y位清0

方法二:

置0,用0去‘与’;置1,用1去‘或’ 

int a|=(1<<i)

int a&=~(1<<i)

 

3.循环移位

#define ROTATE_LEFT(x, n) ((x) << (n)) | ((x) >> ((8 * sizeof(x)) - (n))) 
#define ROTATE_RIGHT(x, n) ((x) >> (n)) | ((x) << ((8 * sizeof(x)) - (n)))

 

4.计算绝对值

int abs(int x) 

    int y; 

    y = x>>31; 

    return (x^y)-y; //or:(x+y)^y 

}

 

5.判断整数的符号

int sign(int x) 

         return (x>>31)|(unsigned(-x))>>31;
}

 

6.两个数比较

  x==y: ~(x-y|y-x) 
  x!=y: x-y|y-x 
  x
  x<=y: (x|~y)&((x^y)|~(y-x)) 
  x
  x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较

 

7.交换两个数的值(swap) ---小心越界

1.x^= y ; y ^= x ; x ^= y ;

2.x= x+y ; y = x-y ; x = x-y ;

3.x= x-y ; y = y+x ; x = y-x ;

4.x= y-x ; x = y-x ; x = x+y ;

 

8.位计数

方法一:
int count(long v)
{

    int number = 0;
 
    while(v)
    {

        v &= (v-1);

        number++;

    }

    return number;

}
方法二:
int count(unsigned x) 

    x = x-((x>>1)&0x55555555) ; 
    x = (x&0x33333333)+(x>>2)&0x33333333); 
    x = (x+(x>>4))&0x0f0f0f0f; 
    x = x+(x>>8); 
    x = x+(x>>16); 

    return x&0x0000003f; 

}

 

9.二进制和GRAY码的转换

(1).二进制码到GRAY码的转换:

unsigned B2G(unsigned B )

{

return B^ (B>>1) ;

}

 

(2).GRAY码到二进制码:

unsigned G2B(unsigned G)

{

unsigned B ;

 

B = G^ (G>>1) ;

B = G^ (G>>2) ;

B = G^ (G>>4) ;

B = G^ (G>>8) ;

B = G^ (G>>16) ;

 

return B ;

  }

 

10.位反转

unsigned rev(unsigned x)

{

x = (x & 0x55555555) << 1 | (x>>1) & 0x55555555;

x = (x & 0x33333333) << 2 | (x>>2) & 0x33333333;

x = (x & 0x0f0f0f0f) << 4 | (x>>4) & 0x0f0f0f0f;

x = (x<<24) | ((x&0xff00)<<8) | ((x>>8) & 0xff00) | (x>>24) ;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构设计中的方法学(七)

十三、代码验证   要保证架构的稳定和成功&#xff0c;利用代码对架构进行验证是一种实用的手段。代码验证的核心是测试&#xff0c;特别是单元测试。而测试的基本操作思路是测试优先&#xff0c;它是敏捷方法中非常重要的一项实践&#xff0c;是重构和稳定核模式的重要保障。…

十进制转二进制,八进制,十六进制

十进制转二进制&#xff1a; #include<stdio.h> int main() {int a[20],x;int rem,i0;scanf("%d",&x);do{remx%2;xx/2;a[i]rem;i;}while(x!0);while(i>0)printf("%d",a[--i]);printf("\n");return 0; }十进制转八进制&#xff1a; …

呵,你会51单片机的精确延时吗?

文章整理自网络序对于某些对时间精度要求较高的程序&#xff0c;用 c 写延时显得有些力不从心&#xff0c;故需用到汇编程序。本人通过测试&#xff0c;总结了 51 的精确延时函数(在 c 语言中嵌入汇编)分享给大家。至于如何在 c 中嵌入汇编大家可以去网上查查&#xff0c;这方面…

SignalR

原址: http://www.cnblogs.com/shanyou/archive/2012/07/28/2613693.html SignalR是什么&#xff1f; SignalR是一个继承的客户端与服务器库&#xff0c;基于浏览器的客户端和基于ASP.NET的服务器组件可以借助它来进行双向多步对话&#xff0c;换句话说&#xff0c;该对话可不…

C语言——数组、函数、指针

C语言——数组、函数、指针 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、有什么作用&#xff1f;为什么要使用它们&#xff1f; &#xff08;1&#xff09;数组&#xff1a;提供一段连续的存储空间&#xff0c;存数据和字符串很方便&#xff1b; …

--4、实验室设备管理(表)

--4、实验室设备管理create table Computer( Computer_id int Identity Primary key,--设备编号 Computer_name varchar(50) not null,--设备名称 Computer_num varchar(50) not null,--设备编号,财产号 room_id int not null,--实验室编号 --Computer_IP varchar(128), -…

十六进制转十进制

问题描述从键盘输入一个不超过8位的正的十六进制数字符串&#xff0c;将它转换为正的十进制数后输出。注&#xff1a;十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535 #include<stdio.h> #include<string.h> #include<…

C#中Invoke的用法

在用.NET Framework框架的WinForm构建GUI程序界面时&#xff0c;如果要在控件的事件响应函数中改变控件的状态&#xff0c;例如&#xff1a;某个按钮上的文本原先叫“打开”&#xff0c;单击之后按钮上的文本显示“关闭”&#xff0c;初学者往往会想当然地这么写&#xff1a; v…

三类危险的TXT文件

一。 隐藏HTML扩展名的TXT文件 假如您收到的邮件附件中有一个看起来是这样的文件&#xff1a;QQ 放送.txt&#xff0c;您是不是认为它肯定是纯文本文件&#xff1f;我要告诉您&#xff0c;不一定&#xff01;它的实际文件名可以是QQ 放送.txt{3050F4D8-98B5-11CF-BB82-00AA00BD…

嵌入式如何入门,要不要学习Python

#提问我是你的公众号读者朋友&#xff0c;江苏省在读大学生一名&#xff0c;目前是大四免研。研究生方向是嵌入式系统与应用(导师招这样的学生&#xff0c;但是本身设计这个方向不多)&#xff0c;目前还比较有时间&#xff0c;想要自己深入学习一下嵌入式方面的知识&#xff0c…

13.强符号和弱符号

我们在编写代码的过程中经常会遇到一种叫做符号重复定义&#xff08;Multiple Definition&#xff09;的错误&#xff0c;这是因为在多个源文件中定义了名字相同的全局变量&#xff0c;并且都将它们初始化了。 例如&#xff0c;在 a.c 中定义了全局变量 global&#xff1a; int…

C语言——预编译

C语言——预编译 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 在C 语言中&#xff0c;并没有任何内在的机制来完成如下一些功能&#xff1a;在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作&#xff0c;就需要使…

深入理解cache对写好代码至关重要

There are only two hard things in Computer Science: cache invalidation and naming things.-- Phil Karlton全文目录CACHE基础CACHE的组织TAG,INDEXVIVT,VIPT,PIPTCache别名问题CACHE一致性icache、dcache同步多CPU核cache同步CPU与设备cache同步意识到CACHE的编程perf中的…

[推举]网络工程师必懂的专业术语

路由器问题&#xff1a; 1、什么时候使用多路由协议&#xff1f; 当两种不同的路由协议要交换路由信息时&#xff0c;就要用到多路由协议。当然&#xff0c;路由再分配也可以交换路由信息。下列情况不必使用多路由协议&#xff1a; 从老版本的内部网关协议&#xff08; Interio…

基础练习 特殊回文数

问题描述123321是一个非常特殊的数&#xff0c;它从左边读和从右边读是一样的。输入一个正整数n&#xff0c; 编程求所有这样的五位和六位十进制数&#xff0c;满足各位数字之和等于n 。输入格式输入一行&#xff0c;包含一个正整数n。输出格式按从小到大的顺序输出满足条件的整…

IO流--buffer

示例展示&#xff1a; package buffer;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.I…

Linux 用户空间和内核空间

最近在微信群里看到有人提这个问题&#xff0c;然后查了下资料&#xff0c;觉得这篇文章是写得最能让人看懂的&#xff0c;分享给大家。欢迎大家评论说出自己的见解&#xff0c;让更多的人更容易理解这部分知识。之前的相关文章Linux内存&#xff0c;先看这篇文章Linux物理内存…

数据库的学习

自从搬到那边学校去了&#xff0c;就好久都没有写过我的学习了。因为没那么多时间上网了&#xff0c;有时候去网吧上网也不想写了。又开始了一本书的学习&#xff0c;那就是数据库。还记得去年那个时候学数据库的时候&#xff0c;大家都说我们学会最多的就是ctrlc和ctrlv&#…

2017.12.20-21

1.今天&#xff0c;继续学习公司产品DDS的开发手册。 首先&#xff0c;其中有几个概念需要认识&#xff1a; CORBA(Common Object Request Broker Architecture):公共对象的请求代理体系结构&#xff0c;OMG组织定义的一种面向对象应用的标准国际规范架构。为简化跨平台应用而提…

C语言——宏定义

C语言——宏定义 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 注意&#xff1a;宏定义不是函数&#xff01;&#xff01; 一般用来简化操作的&#xff0c;但又能避免函数调用那样需要进行切换环境&#xff0c;花费时间。例如&#xff1a; #define ma…