the*_*sti -1 c c++ bit-manipulation bit-shift bitwise-operators
在我的系统上,(unsigned char) -1是(预计为 8 位字符) 1111 1111 二进制(255 十进制)。
同样,(unsigned char) -1 >> 1正如预期的 0111 1111。左边填充了一个零。
~((unsigned char) -1 >> 1) 正如预期的那样,是 1000 0000。
现在我想生成 unsigned char 0010 0000 例如。
我试过了~((unsigned char) -1 >> 1) >> 2,但这输出 1110 0000 .... 什么?为什么左边突然被填满了?
如何生成unsigned char启用第 n 位(从左侧)的 ?
我想
n unsigned char
0 1000 0000
1 0100 0000
2 0010 0000
3 0001 0000
...
7 0000 0001
Run Code Online (Sandbox Code Playgroud)
此刻,~((unsigned char) -1 >> 1) >> n正在给我
n unsigned char
0 1000 0000
1 1100 0000
2 1110 0000
3 1111 0000
...
7 1111 1111
Run Code Online (Sandbox Code Playgroud)
这个问题存在于uint8_t, uint16_t,但不再发生在uint32_t和 更大。
由于整数提升,当对值执行几乎任何操作时会unsigned char被提升int。
当您右移时,左操作数会进行整数提升,unsigned char并将变为int. 表达式的值将是提升后左操作数的((unsigned char) -1 >> 1)值- 因此 的结果值为 127,类型为int。如果你~ (int)127会得到一个int带符号位的集合;转移该权利将具有实现定义的行为。
解决的办法是增加一个铸围绕外~:
(unsigned char)~((unsigned char) -1 >> 1) >> 2
Run Code Online (Sandbox Code Playgroud)
或者,&值与0xFF:
(~((unsigned char) -1 >> 1) >> 2) & 0xFF
Run Code Online (Sandbox Code Playgroud)
至于设置 的n左起第 th 位unsigned char,最好的解决方案是 *left-shift1U到该位置,如Allan Wind所示。
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |