[英]Bits Shift in C- is the i bit on?
我正在尝试了解以下功能,该功能确定是否打开:
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位,因此这可能是我第一个问题的答案。
它不会给你第五位。 二进制数从2 0开始,因此第一位实际上是用0
而不是1
索引的。 它将给您返回第六位。
例子:
ch & (1 << 0); // first bit
ch & (1 << 1); // second bit
ch & ((1 << 3) | (1 << 2)); // third and fourth bit.
同样,字符只是数字的解释。 在大多数计算机上,它的大小为8位,您可以将其解释为无符号值(0到255)或有符号值(-128到127)。 因此,基本上它是一个范围非常有限的整数,因此您可以进行移位而不进行转换。
同样,只有在未设置给定位的情况下,函数才会返回等于零的整数值。 否则,它是一个非零值。
该函数可能返回一个char,因为它处理的输入也只是一个char。 您当然不能传递ch = abcdefgh,因为那将是8个字符的字符串。
您可以对字符进行移位,因为C允许这样做。 char
只是8位整数类型,因此无需禁用它。
您是正确的事实,如果字母a,b等是数字二进制表示形式中的位,则isBitISet(abcdefgh, 5)
返回00c00000
。 返回值不是the fifth bit from the right
,它是与输入中相同的数字,但除第五位外的所有位都为零。 您还必须记住,位的编号从零开始,因此第五位是c
,就像第零位是h
。
本示例使用整数类型表示布尔值。 这在C99之前的C代码中很常见,因为C没有bool
类型。 如果将返回值视为布尔值,请记住所有非零值均为true,零值为false。 因此,如果设置了位i
则isBitISet
的输出对于C为true,否则为false。
您现在应该知道,在计算机中,所有内容都以0开头。也就是说,第5位实际上是第六位(而不是第五位)。
您的分析实际上是正确的,如果给它abcdefgh
和5
,则得到00c00000
。
当您执行“与”操作时:
return mask & ch;
由于mask
类型为int
,因此ch
也将自动转换为int
(与许多其他运算符相同)。 这就是为什么您不需要显式强制转换。
最后,此函数的结果格式为0..0z0..0。 如果z
,您要检查的位为0,则此值为0,只要涉及if
,则该值为false。 如果不为零,则if
为true。
首先,此函数不返回第i位,但会告诉您该位是打开还是关闭。
char mask
的使用取决于实现方式。 简单地定义一个8位掩码,因为要应用此掩码的值是char
。
当1
是字符时,为什么还要强制转换? i
只是<<操作符的值。
ch=abcdefgh
作为输入没有意义。 ch
是char,因此ch
只能是一个字符。
工作方式如下:首先,构造一个掩码,将不需要的所有位清零。 因此,例如,如果输入为ch = 204
( ch = 11001100
),并且我们想知道第6位是否打开,则i =5。所以mask = 1 << 5 = 00100000
。 然后,通过与运算将该掩码应用于值。 这将使除所讨论位以外的所有内容都归零: 11001100 & 00100000 = 00000000 = 0
。 由于C中的0为假,因此未设置第6位。 在相同ch
输入上且i = 6的另一个示例: mask = 1 << 6 = 01000000
; 11001100 & 01000000 = 01000000 = 64
,这不是0,因此为true,因此设置了第7位。
做:
return 0 != (mask & ch) ;
如果您想要布尔值(0x00000000或0x00000001)返回。 单独使用mask & ch
可以为您提供正确位置所需的信息。
(其他人说的足以使i = 5等于第六位)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.