写点什么

C#位运算,面试要掌握这几个关键点

用户头像
Geek_f90455
关注
发布于: 1 小时前

????} else if ((i_name& 16) == 16) {


???? ?ret= StaticUtil.girlIni.ReadValue("girl",country+"-10");


????} else if ((i_name& 32) == 32) {


?????????ret= StaticUtil.girlIni.ReadValue("girl",country+"-20");


????}


????return ret;


}





③保留某一个数的某一位


与一个数进行&运算,此数在该位取1


例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。


按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。


3、位逻辑或运算


位逻辑或运算将两个运算对象按位进行与运算,1或1等1,1或0等于1


0|0=0,0|1=1,1|0=1,1|1=1。


用途:


对一个数的某些位定值为1


例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13


4、位逻辑异或运算


位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:相同得0,相异得1


0^0=0,0^1=1,1^0=1,1^1=0.


用途:


①使特定位翻转


假设有01111010,想使其低4位翻转,可以对它与00001111进行^运算


01111010^00001111=01110101


②与0相^,保留原值


③交换连个值,不用临时变量


假如a=3,b=4,,想将a和b的值互换,可以用以下赋值语句实现:


a=a^b;


b=b^a;?


a=a^b;


5、位左移运算


位左移运算将整个数按位左移若干位,左移后空出的部分补0,比如8位的byte型变量byte a = 0x65(即二进制的01100101,十进制的101),将其左移3位的结果时0x28(即二进制的00101000,十进制的40)


用途:
左移一位相当于乘以2,这个我想它只适用于高位都为0的情况


例如:


十进制数15,15<<3=?


猜测:15\*2\*2\*2 =120


实际运算:


?![0c98b5ce9d99696e6c8a8d96557c99698bd.jpg](https://static001.geekbang.org/infoq/42/4207db230651a1e2454a3bd83b30d4d9.png)


![e66d61c9871fe531a9364665a31eb148a63.jpg](https://static001.geekbang.org/infoq/d8/d8aa9c89882512b1c1419376c9857cac.png)


但是如果被移除的高位中包含1,则会出现异常,需要抛异常?哈哈


十进制数85,85<<3=?


猜测:


85\*2\*2\*2 = 680


实际上:


01010101<<3 = 10101000? 十进制为168


为什么呢?不明白,待以后分析吧


6、位右移运算


位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。


用途:
右移一位相当于除以2


类似于位左移运算。


7、位运算赋值运算符


位运算符与赋值运算符可以组成复合赋值运算符,如:
???? &=,|=,>>=,<<=,^=


8、不同长度的数据进行位运算


如果两个数据长度不同,进行位运算时(如:a&b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0,若b为负数,左端应补满1


9、位域


有些信息在存储时,并不需要占用一个完整的字节,而值需占几个或一个二进制位。


例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域“,所谓”位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。


一、位域的定义和位域变量的说明,位域定义与结构定义相仿,其形式为:


struct位域结构名


{位域列表};


其中位域列表的形式为:类型说明符 位域名:位域长度


例如:
复制代码


struct bs{


int a:8;


int b:2;


int c:6;


};





位域变量的说明与结构变量说明的方式相同,可采用先定义后说明,同时定义说明或者直接说明三种方式。例如:
复制代码


struct bs


{


int a:8;


int b:2;


int c:6;


}data;





说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:


1、一个位域必须存放在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一个位域时,应从下一单元起存放该位域。也可以有意使某位域从下一个单元开始。例如:
复制代码


struct bs


{


unsigned a:4


unsigned :0 /空域/


unsigned b:4 /从下一单元开始存放/


unsigned c:4


}





在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。


2、由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。


3、位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:?
复制代码


struct k


{


int a:1


int :2 /该 2 位不能使用/


int b:3


int c:2


};





从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。


二、位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
复制代码


main(){


struct bs


{


unsigned a:1;


unsigned b:3;


unsigned c:4;


} bit,*pbit;


bit.a=1;


bit.b=7;


bit.c=15;


printf("%d,%d,%d\n",bit.a,bit.b,bit.c);


pbit=&bit;//位域变量 bit 的地址送给指针变量 pbit


pbit->a=0;//用指针方式给位域 a 重新赋值


pbit->b&=3;//复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3 位域 b 中原有值为 7,与 3 作按位与运算的结果为、、3(111&011=011,十进制值为 3)。


pbit->c|=1;//复合位运算"|=", 相当于: pbit->c=pbit->c|1 其结果为 15。

写在最后

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?


就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验 Java 程序员的技术功底。


最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java 经典面试问题(含答案解析).pdf 和一份网上搜集的“Java 程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm 性能调优、Spring,MyBatis,Nginx 源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx 等多个知识点高级进阶干货!


由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!有需要的朋友可以戳这里免费获取


Java 经典面试问题(含答案解析)

阿里巴巴技术笔试心得


用户头像

Geek_f90455

关注

还未添加个人签名 2021.07.06 加入

还未添加个人简介

评论

发布
暂无评论
C#位运算,面试要掌握这几个关键点