C语言按位运算符

一、按位逻辑运算符
1、二进制反码或按位取反: ~

一元运算符 ~ 把1变为0,把0变为1。例子:

~(10011010) 		// 表达式
01100101			// 结果
newval = ~val;		// val的值不会变,val取反赋值给newval
2、按位与: &

二元运算符&,通过逐位比较来个运算对象。生成一个新值。对于每个位,只有来个运算对象中相应的位都为1时,结果才为1.

3、按位或: |

二元运算符|,通过逐位比较来个运算对象。,生成一个新值。对于每个位,只有来个运算对象中相应的位为1,结果就为1.

4、按位异或: ^

二元运算符 ^,通过逐位比较来个运算对象。,生成一个新值。对于每个位,只有来个运算对象中相应的位一个为1,结果就为1.

二、用法:掩码

按位 与 运算常用于掩码(mask)。所谓掩码指的是一些设置为开(1)或关(0)的位组合。
例如假设定义符号常量mask为2(即,二进制形式为00000010),只有1号位是1,其他位都是0。下面的语句

flags = flags | mask

把flags中除1号位意外的所有位设置为0,因为按位与运算符(&)任何位与0组合都得0。1号位的值不变(如果1号位是1,那么1&1得1;如果1号位0,那么0&1也得0)。这个过程叫做“使用掩码”,因为掩码中的0吟唱了flags中乡音的位。
C语言按位运算符_第1张图片

三、用法:打开位

有时需要打开一个值中的特定位,同事保持其他位不变。
例如:假设flags是00001111,mask是10110110。下面表达式

flag | mask

即是
(00001111)| (10110110)
结果为
10111111.

四、位移运算符
1、左移

左移运算符 (<<) 将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末位端位的值丢失,用0填充空出的位置。
例如:下面的例子中,每一位都向左移动来个位置

(10001010) << 2   	// 表达式
(00101000)			// 结果值

该操作产生了一个新的位值,但是不改变其运算对象。例如stonk为1,那么stonk<<2微,但是stonk本身不变。

2、右移

右移运算符(>>) 将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢失。对于无符号类型,用0填充空出的位置;对于有符号类型,其结果取决于机器。

(10001010) >> 2		// 表达式,有符号值
(00100010) 			// 某些系统的结果
(10001010) >> 2		// 表达式,有符号值
(11100010) 			// 某些系统的结果

下面是无符号的:

(10001010) >> 2		// 表达式,无符号值
(00100010) 			// 某些系统的结果

3、用法:移位运算符
移位运算符针对2的幂提供快速有效的除法和乘法:
number << 2 number乘以2的n次幂
number >> 2 如果number 为非负,则用number除以2的n幂

五、代码

#include 
#include 	// 提供CHAR_BIT的定义, CHAR_BIT 表示每字节的位数

char * itobs(int,  char *);
void show_bstr(const char *);


int main()
{
	char bin_str[CHAR_BIT * sizeof(int) + 1];
	int number = 0;
	
	puts("输入整数并以二进制形式查看它们");
	puts("非数字输入终止程序");
	while(scanf("%d", &number) == 1)
	{
		itobs(number, bin_str);
		printf("%d is", number);
		show_bstr(bin_str);
		putchar('\n');
	}
	
	puts("success!!!");

	return 0;
}


char * itobs(int n, char * ps)
{
	int i = 0;
	const static int size = CHAR_BIT * sizeof(int);
	for(i = size - 1; i >= 0; i--, n >> 1)
	{
		ps[i] = (01 & n) + '0';
	}
	ps[size] = '\0';
	
	return ps;
}

/* 4位一组显示二进制字符串 */
void show_bstr(const char *str)
{
	int i = 0;
	
	while(str[i])		/* 不是一个空字符 */
	{
		putchar(str[i]);
		if(++i % 4 ==0 && str[i])
		{
			putchar(' ');
		}
	}
}

你可能感兴趣的:(c语言,c语言,开发语言)