c - C- 中的位移位 i 是否打开?

标签 c bit-shift

我试图理解以下决定是否打开位的函数:

int isBitISet( char ch, int i )
{
   char mask = 1 << i ;
   return mask & ch ;
}

首先,为什么我得到一个字符?对于 ch=abcdefghi=5该函数假设返回右起第五位 (?) , d .所以mask=00000001<<5=00100000 , 和 00100000 & abcdefgh = 00c00000 .

你能解释一下我们为什么会得到 char 并且我们可以在没有任何转换的情况下完成所有这些转变吗?为什么我们没有得到第五位,为什么返回值实际上是该位是否打开的指示?

编辑:'abcdefg' 只是位的符号,我并不是要表示 char 类型的字符串。

我以前认为 char 是 'a'而不是实际的 8 位,所以这可能是我第一个问题的答案。

最佳答案

它不会给你第五位。二进制数从 20 开始,因此第一位实际上是用 0 索引的,而不是用 1 索引的。它会给你返回第六位。

例子:

ch & (1 << 0); // first bit
ch & (1 << 1); // second bit
ch & ((1 << 3) | (1 << 2)); // third and fourth bit.

此外,char 只是对数字的解释。在大多数机器上,它的大小为 8 位,您可以将其解释为无符号值(0 到 255)或有符号值(-128 到 127)。所以基本上它是一个范围非常有限的整数,因此您可以在不转换的情况下应用位移。

此外,当且仅当未设置给定位时,您的函数将返回一个等于零的整数值。否则它是一个非零值。

关于c - C- 中的位移位 i 是否打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11500506/

相关文章:

c - X11/Xlib.h : No such file or directory in Windows 8

java - Java整数左移的奇怪结果

c - 如何在 C 中获取无符号 8 位类型的最高有效位

Java - 整数和字节的位移位

c - 不同 gcc 版本的语法错误?

c - 在信号处理程序 (ppc64) 中提取程序计数器(指令指针)

任何人都可以使用 opengl 在 c 中给我一个简短的代码示例,其中单击两个不同的方 block 会改变它们的颜色?

使用宏进行比较时,CLion 给出 'expression expected'

java - java中的运算符>>和运算符>>>有什么区别?

c - 为什么先左移然后右移,而不是 AND 运算?