8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
实话说,写了一年多的代码了,从来没有想过要对数据进行按位运算。接触之后发现这跟《数据逻辑》的部分知识结构相吻合,比如与门、或门、非门等。相信学计算机的大家们早已烂透在心底了。我这里做一个记录,方便以后写C的时候查询。
在C语言中,可以单独操控变量中的位。
处理一个值中的位的两个C工具:位运算符和位字段
按位逻辑运算符
二进制反码或按位取反:~
一元运算符~把1变为0,把0变为1。例子如下:1
2
3
4~(10011010)
(01100101) // 结果值
val = ~val;
按位与:&
二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中相应的位都为1时,结果才为1。例子如下:1
2
3
4
5(10010011)&(00111101)
(00010001) // 结果值
val &= 0377;
val = val & 0377;
按位或:|
二元运算符,通过逐位比较两个运算对象,生成一个新值。对于每个位,如果两个运算对象中相应的位为1,结果就为1.1
2
3
4
5(10010011)|(00111101)
(10111111) // 结果值
val |= 0377;
val = val | 0377;
按位异或:^
二位运算符……逐位比较两个运算对象。对于每个位,如果两个运算对象中相应的位一个为1(但不是两个为1),结果为1。1
2
3
4
5(10010011)^(00111101)
(10101110) // 结果值
val ^= 0377;
val = val ^ 0377;
移位运算符
下面介绍C的移位运算符。移位运算符向左或右移动位。
左移:<<
左侧运算对象移出左末端位的值丢失,用0填充空出的位置。1
2(10001010) << 2
(00101000) // 结果值
右移:>>
对于无符号类型,用0填充空出的位置。1
2(10001010) >> 2 // 表达式,无符号值
(00100010) // 所有系统都得到该结果值
对于有符号类型,其结果取决于机器。1
2
3
4(10001010) >> 2 // 表达式,有符号值
(00100010) // 在某些系统中的结果值
(10001010) >> 2 // 表达式,有符号值
(11100010) // 在另一些系统上的结果值
位字段
操控位的第二种方法是位字段。
下面的声明建立一个4个1位的字段:1
2
3
4
5
6struct {
unsigned int autfd : 1;
unsigned int bldfc : 1;
unsigned int undln : 1;
unsigned int itals : 1;
}
这时候就能通过下列语句赋值:1
2prnt.itals = 0;
prnt.undln = 1;
注意需要赋的值不能超过位数所能表示的最大数值,不然会占用下一个unsigned int类型的存储位置。