我试图理解以下决定是否打开位的函数:
int isBitISet( char ch, int i )
{
char mask = 1 << i ;
return mask & ch ;
}
首先,为什么我得到一个字符?对于 ch=abcdefgh
和 i=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/