c语言 t自己设置跳跃位置,[总结] C语言的位操作技巧
置位
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
判断位是否为1 if (a & BIT3)
nt a|=(1<
int b&=~(1<
x=x|0x0100 //把第三位置1
x=x&0x1011 //把第三位置0
#define BitGet(Number,pos) ((Number) >> (pos)&1)) //用宏得到某数的某位
#define BitSET(Number,pos) ((Number) |= 1<
#define BitCLEAR(Number,pos) ((Number) &= ~(1<
#define BitREV(Number,pos) ((Number) ^= 1<
除 i = 879 / 16; <=> i = 879 >> 4;
模 i = 879 % 32; <=> i = 879 - (879>>5<<5); <=> i = 879 & 31;
循环移位 区别于一般移位的是移位时没有数位的丢失。循环左移时,用从左边移出的位填充字的右端,而循环右移时,用从右边移出的位填充字的左侧。这种情况在系统程序中时有使用,在一些控制程序中用得也不少。
设有数据说明:
a=01111011,循环左移2位 正确结果: 11101101
过程:
b=a>>(8-2) 用来得到正常左移丢失的位和循环移位后其正确位置 b=00000001;
a=a<<2;左移 a=11101100
a=a|b; a=11101101
如果不是用中间变量 a=(a>>(8-2))|(a<<2)
总长度N(8 16 32)
循环左移n (a>>(N-n))|(a>>n)
循环右移n (a<>n)
检测一个无符号数是不为2^n-1(^为幂): x&(x+1)
将最右侧0位改为1位: x | (x+1)
二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x
x<=y: (x|~y)&((x^y)|~(y-x))
x
x<=y: (~x|y)& amp;((x^y)|~(y-x))//无符号x,y比较
使用位运算的无分支代码:
计算绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ;//or: (x+y)^y
}
符号函数:sign(x) = -1, x<0; 0, x == 0 ; 1, x & gt; 0
int sign(int x)
{
return (x>>31) | (unsigned(-x))>>31 ;//x=-2^31 时失败(^为幂)
}
三值比较:cmp(x,y) = -1, x< y; 0, x==y; 1, x > y
int cmp( int x, int y )
{
return (x>y)-(x-y) ;
}
doz=x-y, x>=y; 0, x
int doz(int x, int y )
{
int d ;
d = x-y ;
return d & ((~(d^((x^y)&(d^x))))>>31) ;
}
int max(int x, int y )
{
int m ;
m = (x-y)>>31 ;
return y & m | x & ~m ;
}
不使用第三方交换x,y:
1.x ^= y ; y ^= x ; x ^= y ;
2.x = x+y ; y = x-y ; x = x-y ;
3.x = x-y ; y = y+x ; x = y-x ;
4.x = y-x ; x = y-x ; x = x+y ;
双值交换:x = a, x==b; b, x==a//常规编码为 x = x==a ? b :a ;
1.x = a+b-x ;
2.x = a^b^x ;
下舍入到2的k次方的倍数:
1.x & ((-1)<
2.(((unsigned)x)>>k)<
上舍入:
1. t = (1<
2.t = (-1)<
位计数,统计1位的数量:
1.
int pop(unsigned x)
{
x = x-((x>>1)&0x55555555) ;
x = (x&0x33333333) + ((x>>2) & 0x33333333 ) ;
x = (x+(x>>4)) & 0x0f0f0f0f ;
x = x + (x>>8) ;
x = x + (x>>16) ;
return x & 0x0000003f ;
}
2.
int pop(unsigned x) {
static char table[256] = { 0,1,1,2, 1,2,2,3, ...., 6,7,7,8 } ;
return table[x&0xff]+table[(x>>8)&0xff]+table[(x>>16)&0xff]+table[(x>>24)] ;
}
奇偶性计算:
x = x ^ ( x>>1 ) ;
x = x ^ ( x>>2 ) ;
x = x ^ ( x>>4 ) ;
x = x ^ ( x>>8 ) ;
x = x ^ ( x>>16 ) ;
结果中位于x最低位,对无符号x,结果的第i位是原数第i位到最左侧位的奇偶性
位反转:
unsigned rev(unsigned x)
{
x = (x & 0x55555555) <>1) & 0x55555555 ;
x = (x & 0x33333333) <>2) & 0x33333333 ;
x = (x & 0x0f0f0f0f) <>4) & 0x0f0f0f0f ;
x = (x<<24) | ((x&0xff00)<<8) | ((x>>8) & 0xff00) | (x>>24) ;
return x ;
}
递增位反转后的数:
unsigned inc_r(unsigned x)
{
unsigned m = 0x80000000 ;
x ^= m ;
if( (int)x >= 0 )
do { m >>= 1 ; x ^= m ; } while( x
return x ;
}
混选位:
abcd efgh ijkl mnop ABCD EFGH IJKL MNOP->aAbB cCdD eEfF gGhH iIjJ kKlL mMnN oOpP
unsigned ps(unsigned x)
{
unsigned t ;
t = (x ^ (x>>8)) & 0x0000ff00; x = x ^ t ^ (t<<8) ;
t = (x ^ (x>>4)) & 0x00f000f0; x = x ^ t ^ (t<<4) ;
t = (x ^ (x>>2)) & 0x0c0c0c0c; x = x ^ t ^ (t<<2) ;
t = (x ^ (x>>1)) & 0x22222222; x = x ^ t ^ (t<<1) ;
return x ;
}
位压缩:
选择并右移字x中对应于掩码m的1位的位, 如:compress(abcdefgh,01010101)=0000bdfh
compress_left(x,m)操作与此类似,但结果位在左边: bdfh0000.
unsigned compress(unsigned x, unsigned m)
{
unsigned mk, mp, mv, t ;
int i ;
x &= m ;
mk = ~m <
for( i = 0 ; i
mp = mk ^ ( mk <
mp ^= ( mp <
mp ^= ( mp <
mp ^= ( mp <
mp ^= ( mp <
mv = mp & m ;
m = m ^ mv | (mv >> (1<
t = x & mv ;
x = x ^ t | ( t >> ( 1<
mk = mk & ~mp ;
}
return x ;
}
位置换:
用32个5位数表示从最低位开始的位的目标位置,结果是一个32*5的位矩阵,
将该矩阵沿次对角线转置后用5 个32位字p[5]存放。
SAG(x,m) = compress_left(x,m) | compress(x,~m) ;
准备工作:
void init( unsigned *p ) {
p[1] = SAG( p[1], p[0] ) ;
p[2] = SAG( SAG( p[2], p[0]), p[1] ) ;
p[3] = SAG( SAG( SAG( p[3], p[0] ), p[1]), p[2] ) ;
p[4] = SAG( SAG( SAG( SAG( p[4], p[0] ), p[1]) ,p[2]), p[3] ) ;
}
实际置换:
int rep( unsigned x ) {
x = SAG(x,p[0]);
x = SAG(x,p[1]);
x = SAG(x,p[2]);
x = SAG(x,p[3]);
x = SAG(x,p[4]);
return x ;
}
二进制码到GRAY码的转换:
unsigned B2G(unsigned B )
{
return B ^ (B>>1) ;
}
GRAY 码到二进制码:
unsigned G2B(unsigned G)
{
unsigned B ;
B = G ^ (G>>1) ;
B = G ^ (G>>2) ;
B = G ^ (G>>4) ;
B = G ^ (G>>8) ;
(lovezncu)
c语言 t自己设置跳跃位置,[总结] C语言的位操作技巧相关推荐
- C语言系统如何设置多个switch,c语言switch语句如何使用
C语言的利用比较之多,它兼具了高级语言的汇编语言的特点,相较于其它编程语言具有较大优势.那么C语言中的switch语句如何使用呢? switch语句允许检测数组与值列表的相等性,每个值称之为实例以及c ...
- 卫星位置计算的c语言,C语言-详细计算GPS卫星位置.doc
C语言-详细计算GPS卫星位置.doc C语言计算GPS卫星位置1 概述在用GPS信号进行导航定位以及制订观测计划时,都必须已知GPS卫星在空间的瞬间位置.卫星位置的计算是根据卫星电文所提供的轨道参数 ...
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置图例位置、移除图例)实战
R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置图例位置.移除图例)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置图例位置 ...
- C语言rewind()函数(设置文件位置为给定流 stream 的文件的开头)(回到文件开头重读)
C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 描述 C 库函数 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文 ...
- C语言通过printf()设置输出显示方式
在调试程序时多数情况下要输出很多提示信息,通过控制输出字体的颜色的显示方式可以方便我们快速查看有用的信息,而printf()的终端转义就为我们提供了这样的手段. 我们大家知道在程序结尾加上\n就可在输 ...
- C语言在屏幕的任意位置输出字符
初学编程的读者,肯定很想编写出一个游戏来秀一下,贪吃蛇就是C语言小游戏中经典的一个,本教程的目标也是带着大家做出这款游戏,你可以猛击<C语言贪吃蛇游戏演示和说明>了解更多. 编写游戏的第一 ...
- C语言\033方式设置字体颜色
C语言\033方式设置字体颜色 原创:丶无殇 2020-2-1 简介 在此,不介绍Windows程序控制台中使用Windows.h库中的setconsoletextattribute函数,仅介绍 ...
- 【翻页电子画册制作软件】云展网教程 | 设置工具栏上按钮显示语言种类
云展网的翻页电子杂志工具栏支持多种语言. 在设置语言栏目可以选择是否显示切换语言按钮,以及按钮显示的语言类型. 点击语言进入语言设置页面: 你可以为翻页电子书创建一个新的语言种类,在对应的标签框当中添 ...
- 计算机格式的语言设置,职称计算机考试WinowsXP辅导:语言和区域设置
职称计算机考试WinowsXP辅导:语言和区域设置 导语:职称计算机的语言和区域设置的`内容你知道吗?如何设置数字.日期.时间.货币格式你知道吗?大家跟着百分网小编一起来看看相关的知识吧. 1.启动语 ...
最新文章
- 数字图像处理——第六章 彩色图像处理
- SpringBoot之错误处理机制
- 使用级联功能实现蓝绿部署和金丝雀发布
- datagrip替换字_Datagrip 快捷键和常用插件持续更新一集一些使用技巧
- javascript常用tool.js
- linux进程间通信练习:对于text.txt文件,子进程将字符串“something communication”写入text.txt,父进程读取text.txt文件内容并打印。
- 宾馆酒店如何对客人进行实名认证登记?
- vue结合vue-amap调用高德地图行政区划分并添加标记点
- vmware tools的下载与安装
- Android架构师绩效考核表,半年绩效考核总结(7.9)
- python+opencv读取文件夹图片并保存
- 新手如何做自媒体赚钱?天天看头条却不赚钱,这份资料对你有启发
- 微博开发者大会SAE宣讲ppt
- C/C++编程:异步编程入门
- IT女孩特不烦恼---九月实习总结
- 让自学python的小伙伴受益匪浅的7个建议
- 敏捷实践之Scrum
- 浏览器控制台模拟触发点击事件
- 超15亿人听力损伤,耳机是罪魁祸首吗?
- Bzoj 2073 [POI2004]PRZ