Java 和 C 中的位运算符

运算符

位运算符是用来对字节或字节中的位进行运算的符号,参加位运算的操作数必须是整型常量或变量。通常,我们把要进行位运算的变量说明为 unsigned 类型。C 语言提供了六种运算符。他们是位与(&)、位或(|)、位异(^)、左移(<<)、右移(>>)和取反(~)。这六种运算符的运算规则如下:
位与(&):
两个相应位上的值全 1,则改位的结果值为 1,否则为0。即:
1&0为 0, 0&1 为 0,0&0为0, 1&1为1
位或(|):
两个相应位上的值全0,则该位的结果值为0,否则为1.即:
1|0为1,0|1为1,0|0为0,1|1为1
位异(^):
两个相应位上的值相同,则该位的结果值为0,不相同为1.即:
1^1为0,0^0为0,1^0为1 0^1为1
左移(<<):
是用来将左操作数的各个二进制位按右操作数给出的值向左移动。操作数移位后,右端出现的空位补零,而移出左端的高位被舍弃。例如:
设 a 的值为十进制数 15,即二进制 00001111,则 a << 2 后得 00111100,即十进制数字60。
右移(>>)
是用来将左操作数的各个二进制数按右操作数给出的值向右移动。操作数移位后,左端出现的空位补零,而移出右端的低位被舍弃。例如:
设b的值为十进制数字28,即二进制数 00011100,则 b >> 2后得 00000111,即十进制数字7。
取反(~)
是用来将操作数按位取反,即操作数的相应位上的值为1时变换成0,为0时变换成1,即 ~0 为1,~1为0。

通过上面的介绍,现对位运算符的运算规则做一小结。如下:

运算符名称    
预算规则
&    
位与
两个相应位全 1 为 1,其余为 0
|
位或
两个相应位全 0 为 0,其余为 1
^
位异或
两个相应位相同为 0,不相同为 1
<<
左移    
把左操作数左移指定的位数
>>
右移
把左操作数右移指定的位数
~
取反
把操作数各位 0 变 1,1 变 0。





下面举一个位运算符的应用示例。
例题:
写一个程序,将整数 x 的低字节作为整数 z 的低字节,整数 y 的低字节作为整数 z 的高字节。

步骤:
a. 将整数 x 的低字节取出,高字节置零。即
   x & 0x00ff
b. 将整数 y 的低字节移至高字节,低字节再置零。即
   (y & 0x00ff)<<8
c. 将上面两者的结果进行合并。即
   (x & 0x00ff) | (y & 0x00ff) <<8

程序如下:
main()
{
  unsigned x,y,z;
  x=0x0531; y=0xabcd
  z=(x & 0x00ff) | (y & 0x00ff) << 8;
  printf("%x/n",z);
}
运行结果如下:
cd31
### Java 中逻辑运算符与位运算符的区别 #### 一、定义与基本功能差异 逻辑运算符用于处理布尔表达式的真假判断,通常应用于条件语句中控制程序流程。常见的有`&amp;&amp;`(逻辑与),`||`(逻辑或),以及`!`(逻辑非)[^1]。 位运算符则是在二进制级别上操作数位的操作符,适用于整型数据类型的按位操作,如`&amp;`(按位与), `|`(按位或), `~`(按位取反)等[^2]。 #### 二、具体实现方式的不同 对于逻辑运算符而言: - 当使用双目逻辑运算符(`&amp;&amp;`, `||`)时,如果第一个操作数已经能够决定整个表达式的结果,则不会去评估第二个操作数,这种特性被称为短路求值[^3]。 例如,在`a &amp;&amp; b`的情况下,当`a`为假时就不会再检查`b`;而在`a || b`里边,只要`a`为真也就不必再去验证`b`了。 而对于位运算符来说: - 它们总是会对两个操作数的所有对应位置上的比特进行逐位比较计算,并且无论左侧还是右侧的操作数值都不会因为另一侧的存在与否受到影响。 ```java // 示例代码展示逻辑运算符vs位运算符的行为差异 public class OperatorExample { public static void main(String[] args){ boolean flagA = true; boolean flagB = false; // 使用逻辑运算符 System.out.println(flagA &amp;&amp; checkCondition()); // 输出:false, 不会打印checkCondition内部的日志信息 int numC = 5; // 二进制表示为0101 int numD = 3; // 二进制表示为0011 // 使用位运算符 System.out.println(numC &amp; numD); // 结果为1 (即0001) // 如果尝试将逻辑运算符误用作位运算符可能会得到意外结果 try{ System.out.println(flagA &amp; &quot;string&quot;); // 编译失败,类型不匹配 }catch(Exception e){ System.out.println(e.getMessage()); } } private static boolean checkCondition(){ System.out.println(&quot;Checking condition...&quot;); return false; } } ``` #### 三、适用场合的选择依据 选择哪种类型的运算符取决于具体的编程需求: - **逻辑运算符**更适合用来构建复杂的条件结构来指导程序分支走向,尤其是在涉及多个变量之间的关系判定时非常有用[^4]; - 而**位运算符**更多地出现在底层硬件交互或者高效算法优化当中,比如图像处理中的像素颜色混合、网络协议包头解析等领域内经常需要用到这类高效的位级操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值