位运算
怎样输入一个unsignedint类型的数n,用位运算获取其二进制形式的第1、3、5位的数值,并将第0、2、3、6位反转,输出结果。(从右往左为第0、1、2…位;如10的二进制形式00001010;)
本帖最后由 村里小黑 于 2021-10-27 16:37 编辑
第一个没太看明白,是保留那几位嘛?那样的话直接和00101010b,第二个直接异或一个01001101b就好了 int main()
{
unsigned int n=122;
printf("%d 转二进制后 分别是 %d %d %d%d %d %d%d \n",n,n>>6&1,n>>5&1,n>>4&1,n>>3&1,n>>2&1,n>>1 &1,n&1);
return 0;
} 本帖最后由 jackz007 于 2021-10-27 19:56 编辑
#include <stdio.h>
char * foo(char s[] , unsigned int d)
{
unsigned int i , k , m ;
for(k = d , m = 0 ; k ; k /= 2 , m ++) ;
for(s = '\0' , k = d , i = m ; k ; k /= 2 , i --) s = '0' + k % 2 ;
return s ;
}
int main(void)
{
unsigned int n , i ;
char s ;
scanf("%u" , & n) ;
printf("%s\n" , foo(s , n)) ;
printf("1 : %d\n" , (n >> 1) & 1) ; /* 第1位 */
printf("3 : %d\n" , (n >> 3) & 1) ; /* 第3位 */
printf("5 : %d\n" , (n >> 5) & 1) ; /* 第5位 */
n = n ^ (1 | (1 << 2) | (1 << 3) | (1 << 6)) ; /* 反转第0、2、3、6 位 */
printf("%s\n" , foo(s , n)) ;
printf("%u\n" , n) ;
n = n ^ (1 | (1 << 2) | (1 << 3) | (1 << 6)) ; /* 复原被反转的第0、2、3、6 位 */
printf("%s\n" , foo(s , n)) ;
printf("%u\n" , n) ;
}
编译、运行实况:
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
87655678
101001110011000010011111110
1 : 1
3 : 1
5 : 1
101001110011000010010110011
87655603
101001110011000010011111110
87655678
D:\00.Excise\C> 本帖最后由 jhq999 于 2021-10-27 17:26 编辑
//都是 unsigned int 变量
a=n&1;
a=(n>>1)&1;
a=(n>>2)&1;
a=(n>>3)&1;
a=(n>>5)&1;
a=(n>>6)&1;
n|=0x4d;//0100 1101b把0、2、3、6位变成1
n&=~a;//如果0位是1,a=1,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11110b),和n按位与,那么n的0位就是0,其他不变;
//是0,a=0,取反就是(1111 1111, 1111 1111, 1111 1111,11111 11111b),和n按位与,那么n的0位就是1,其他不变;
n&=~(a<<2);//先右移到原来的位置,然后和上面一样以此类推
n&=~(a<<3)
n&=~(a<<6)
页:
[1]