我正在尝试理解以下函数,该函数决定是否有位:
int isBitISet( char ch, int i )
{
char mask = 1 << i ;
return mask & ch ;
}
首先,为什么我会得到一个char?对于ch=abcdefgh
和i=5
,函数假设从右边(?)返回第五位,d
。所以mask=00000001<<5=00100000
和00100000 & abcdefgh = 00c00000
。
你能解释一下我们怎么得到char并且我们可以在没有任何演员的情况下完成所有这些转变?为什么我们没有得到第五位以及为什么返回值确实是指示该位是否打开?
编辑:'abcdefg'只是位的符号,我不是要用char类型表示字符串。
我曾经认为char为'a'
而不是实际的8位,所以这可能是我第一个问题的答案。
答案 0 :(得分: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)。所以基本上它是一个范围非常有限的整数,因此你可以在不进行转换的情况下应用位移。
此外,当且仅当未设置给定位时,函数将返回一个等于零的整数值。否则它是一个非零值。
答案 1 :(得分:1)
该函数可能返回一个char,因为它所处理的输入也只是一个char。你肯定无法传递ch = abcdefgh,因为那将是一个由8个字符组成的字符串。
答案 2 :(得分:1)
你可以对字符进行转换,因为C允许这样做。 char
只是一个8位整数类型,因此不需要禁止它。
如果字母a,b等是数字的二进制表示中的位,则isBitISet(abcdefgh, 5)
返回00c00000
,这是正确的。
返回值不是the fifth bit from the right
,它与输入中的数字相同,但是所有位都有,但第五位为零。
您还必须记住位的编号从零开始,因此第五位c
是正确的,就像第零位是h
一样。
此示例使用整数类型表示布尔值。这在C99之前的C代码中很常见,因为C没有bool
类型。
如果将返回值视为布尔值,请记住所有非零都为真,零为假。因此,如果设置了位isBitISet
,则i
的输出为真,否则为假。
答案 3 :(得分:1)
你现在应该知道,在计算机中,一切都从0开始。也就是说,第5位实际上是第6位(不是第5位)。
您的分析实际上是正确的,如果您给它abcdefgh
和5
,则会得到00c00000
。
当您执行“和”时:
return mask & ch;
由于mask
的类型为int
,ch
也会自动转换为int
(与许多其他运营商相同)。这就是你不需要明确施法的原因。
最后,此函数的结果为0..0z0..0。如果z
,您要检查的位为0,则该值为0,只要涉及if
,该值为false。如果它不为零,那么if
就是如此。
答案 4 :(得分:0)
首先,此函数不返回第i位,但会告诉您该位是打开还是关闭。
char mask
的用法取决于此处。只需定义一个8位掩码,因为应用此掩码的值为char
。
为什么1
是个字符时你需要演员? i
只是&lt;&lt;&lt;&lt;操作
ch=abcdefgh
作为输入毫无意义。 ch
是char,因此ch
只能是一个字符。
工作如下:首先构造一个掩码,将所有不需要的位置零。因此,例如,如果输入是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 = 01000000
; 11001100 & 01000000 = 01000000 = 64
,它不是0,因此是真的,所以设置了第7位。
答案 5 :(得分:0)
执行:
return 0 != (mask & ch) ;
如果你想要一个bool(0x00000000或0x00000001)返回。只有mask & ch
会给你一些你在正确位置询问的信息。
(其他人说的不仅仅是i = 5是第六位)