1

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

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

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

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

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

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

4

6 回答 6

2

它不会给你第五位。二进制数从 2 0开始,因此第一位实际上是用 索引的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)。所以基本上它是一个范围非常有限的整数,因此您可以在不强制转换的情况下应用位移。

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

于 2012-07-16T08:29:58.000 回答
1

该函数可能返回一个字符,因为它所处理的输入也只是一个字符。您当然不能传入 ch=abcdefgh,因为那将是一个 8 个字符的字符串。

于 2012-07-16T08:26:54.110 回答
1

您可以对字符进行转换,因为 C 允许这样做。char只是一个 8 位整数类型,所以没有必要禁止它。

你是对的,如果字母 a、b 等是数字二进制表示中的位,则isBitISet(abcdefgh, 5)返回。00c00000返回值不是the fifth bit from the right,它与输入中的数字相同,但除了第五位之外的所有位都归零。您还必须记住,位的编号是从零开始的,所以第五位c是正确的,就像第零位是h.

此示例使用整数类型来表示布尔值。这在 C99 之前的 C 代码中很常见,因为 C 没有bool类型。如果您将返回值视为布尔值,请记住,所有非零都是真,零是假。因此,isBitISet如果设置了位,则 C 的输出为真,i否则为假。

于 2012-07-16T08:32:05.067 回答
1

您现在应该知道,在计算机中,一切都是从 0 开始的。也就是说,第 5 位实际上是第 6 位(不是第 5 位)。

你的分析实际上是正确的,如果你给它abcdefgh5你得到00c00000

当你做“和”时:

return mask & ch;

因为mask有 type intch也将自动转换为int(与许多其他运算符相同)。这就是您不需要显式转换的原因。

最后,这个函数的结果是 0..0z0..0 的形式。如果z,您要检查的位为 0,则此值为 0,只要涉及 an 即为假if。如果它不为零,那么对于if.

于 2012-07-16T08:32:38.297 回答
0

做:

return 0 != (mask & ch) ;

如果你想要一个布尔值(0x00000000 或 0x00000001)返回。mask & ch独自一人会给你在正确位置询问的位。

(其他人说的不仅仅是关于 i=5 是第六位)

于 2012-07-16T08:36:28.277 回答
0
  1. 首先,此函数不返回第 i 位,而是告诉您该位是打开还是关闭。

  2. is implementation的用法char mask取决于这里。只需定义一个 8 位掩码,因为应用此掩码的值是char.

  3. 为什么在1char 时需要演员表?i只是 << 运算符的值。

  4. ch=abcdefgh作为输入毫无意义。ch是 char,所以ch只能是一个字符。

  5. 工作如下:首先构建一个掩码,将所有不需要的位归零。例如,如果输入是ch = 204( ch = 11001100) 并且我们想知道第 6 位是否打开,所以 i = 5。所以mask = 1 << 5 = 00100000。然后通过 AND 操作将此掩码应用于该值。这将使除了有问题的位之外的所有内容都归零:11001100 & 00100000 = 00000000 = 0. 由于在 C 中 0 为假,因此不设置第 6 位。ch相同输入和 i = 6的另一个示例mask = 1 << 6 = 0100000011001100 & 01000000 = 01000000 = 64,这不是 0,因此为真,因此设置了第 7 位。

于 2012-07-16T08:36:04.200 回答