C语言位操作详解(全网最全) 您所在的位置:网站首页 位运算符重要吗 C语言位操作详解(全网最全)

C语言位操作详解(全网最全)

2024-07-12 05:11| 来源: 网络整理| 查看: 265

指定某一位数为1

宏 #define setbit(x,y) x|=(1 16) & 0x000000ff) /* 获取第2个字节 */ #define GET_LOW_BYTE3(x) ((x >> 24) & 0x000000ff) /* 获取第3个字节 */

清零某个字节:

#define CLEAR_LOW_BYTE0(x) (x &= 0xffffff00) /* 清零第0个字节 */ #define CLEAR_LOW_BYTE1(x) (x &= 0xffff00ff) /* 清零第1个字节 */ #define CLEAR_LOW_BYTE2(x) (x &= 0xff00ffff) /* 清零第2个字节 */ #define CLEAR_LOW_BYTE3(x) (x &= 0x00ffffff) /* 清零第3个字节 */

置某个字节为1:

#define SET_LOW_BYTE0(x) (x |= 0x000000ff) /* 第0个字节置1 */ #define SET_LOW_BYTE1(x) (x |= 0x0000ff00) /* 第1个字节置1 */ #define SET_LOW_BYTE2(x) (x |= 0x00ff0000) /* 第2个字节置1 */ #define SET_LOW_BYTE3(x) (x |= 0xff000000) /* 第3个字节置1 */

高低位交换

对一个字节数据,逐个交换其高低位,例如11010001,经过0-7,1-6,2-5,3-4对应位的交换,变成10001011 。

对于该问题,我们最先想到的是对原字节通过移位操作来逐位处理,使用另一个变量来存储交换后的结果。这种解决方案处理起来思路清晰,编写代码应该不难。

unsigned char shift_fun1(unsigned char data) { unsigned char i; unsigned char tmp=0x00; for(i=0;i data=(data4); data=((data2)&0x33); data=((data1)&0x55); printf(" after shift fun2 data=%x \n",data); return data; }

判断奇偶数

对于除0以外的任意数x,使用x&1==1作为逻辑判断即可

判断一个数是不是 2 的指数

bool isPowerOfTwo(int n) { if (n int sum=0; while(x) { sum++; x=x&(x-1); } return sum; }

生成组合编码,进行状态压缩

当把二进制当作集合使用时,可以用or操作来增加元素。合并编码 在对字节码进行加密时,加密后的两段bit需要重新合并成一个字节,这时就需要使用or操作。

求一个数的二进制表达中0的个数

int Grial(int x) { int count = 0; while (x + 1) { count++; x |= (x + 1); } return count; }

两个整数交换变量名

void swap(int &a, int &b) { a ^= b; b ^= a; a ^= b; }

判断两个数是否异号

int x = -1, y = 2; bool f = ((x ^ y) "Hello World!"}; char Encrypt[16]={0},Decode[16]={0}; int i; for(i = 0; i Decode[i] = Encrypt[i] ^ KEY; } printf("Initial date: %s\n",p_data); printf("Encrypt date: %s\n",Encrypt); printf("Decode date: %s\n",Decode); return 0; }

求2的N次方

1 8) | (a 1) | ((a & 0x5555) 2) | ((a & 0x3333) 4) | ((a & 0x0F0F) 8) | ((a & 0x00FF) return 1 if(n & 1 == 1){ sum *= m; } m *= m; n = n >> 1; } return sum; }

找出不大于N的最大的2的幂指数

int findN(int n){ n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8 // 整型一般是 32 位,上面我是假设 8 位。 return (n + 1) >> 1; }

二分查找32位整数的前导0个数

int nlz(unsigned x) { int n; if (x == 0) return(32); n = 1; if ((x >> 16) == 0) {n = n +16; x = x 24) == 0) {n = n + 8; x = x 28) == 0) {n = n + 4; x = x 30) == 0) {n = n + 2; x = x 31); return n; }

位图的操作 将 x 的第n位 置1,可以通过 x |= (x n) & 1 来实现 get_bit(char x, int n); 如下:

#define clr_bit(x, n) ( (x) &= ~(1 8) & 0xff) /* most signif byte of 2-byte integer */ #define LSB(x) ((x) & 0xff) /* least signif byte of 2-byte integer*/ #define MSW(x) (((x) >> 16) & 0xffff) /* most signif word of 2-word integer */ #define LSW(x) ((x) & 0xffff) /* least signif byte of 2-word integer*/ /* swap the MSW with the LSW of a 32 bit integer */ #define WORDSWAP(x) (MSW(x) | (LSW(x) 8) & 0xff) #define LNMSB(x) (((x) >> 16) & 0xff) #define LMSB(x) (((x) >> 24) & 0xff) #define LONGSWAP(x) ((LLSB(x)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有