求解位运算原理,越详细越好!

artcpp 2011-04-27 03:57:43
#include <iostream>
#include <bitset>
#include <stdio.h>

using namespace std;

int main()
{
unsigned char i = (13 & 0xf) | (14 & 0xf) << 4;
bitset<8> b(i);
cout << b << endl;
printf("%d - %d\n", (i & 0xf), (i >> 4) & 0xf);
return 0;
}

输出:
11101101
13 - 14
...全文
171 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2011-04-27
  • 打赏
  • 举报
回复
额 应该是扩展为0x0000 000f;
pengzhixi 2011-04-27
  • 打赏
  • 举报
回复
5.13 Bitwise inclusive OR operator [expr.or]
inclusive-or-expression:
exclusive-or-expression
inclusive-or-expression | exclusive-or-expression
1 The usual arithmetic conversions are performed; the result is the bitwise inclusive OR function of its
operands. The operator applies only to integral or enumeration operands.
pengzhixi 2011-04-27
  • 打赏
  • 举报
回复
The shift operators << and >>
The operands shall be of integral or enumeration type and integral promotions are performed. The type of
the result is that of the promoted left operand. The behavior is undefined if the right operand is negative, or
greater than or equal to the length in bits of the promoted left operand.
artcpp 2011-04-27
  • 打赏
  • 举报
回复
printf("%d - %d\n", (i & 0xf), (i >> 4) & 0xf);
---
为什么要加上红色部分?作用是??
lemonlinger 2011-04-27
  • 打赏
  • 举报
回复
位运算原理?? 不就是转化二进制进行运算吗?
artcpp 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
0xf会被扩展为0xffff ffff
[/Quote]
不是吧?
0xf就是:
00001111
这怎么能被放大呢?
0xffff是:
1111111111111111
turing-complete 2011-04-27
  • 打赏
  • 举报
回复
我们用的计算机指令集里面有相应的位运算指令:
移动指令 SHL(逻辑左移)
SAL(算术左移)
SHR(逻辑右移)
SAR(算术右移)
ROL(循环左移)
ROR(循环右移)
RCL(带进位循环左移)
RCR(带进位右移)
pengzhixi 2011-04-27
  • 打赏
  • 举报
回复
(13 & 0xf) | (14 & 0xf) << 4;
0xf会被扩展为0xffff ffff
所以13&0xf 0x0000 000d 14&0xf 0x0000 000e
然后是0x0000 000e<<4 是 0x0000 00e0
再进行或运算就是 0x0000 00ed

然后截取最后一个字节0xed得到i的值展开后就是11101101
nobody@noone 2011-04-27
  • 打赏
  • 举报
回复
位运算只有3个 与 或 异或,连进位都不用,剩下的就是不断重复
bdmh 2011-04-27
  • 打赏
  • 举报
回复
逐步调试便知,并看汇编
pathuang68 2011-04-27
  • 打赏
  • 举报
回复
构造函数
bitset<n> b;
b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则"b0"为"00000";

bitset<n> b(unsigned long u);
b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则"b0"为"00101";

bitset<n> b(string s);
b是string对象s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval4 );
则"b0"为"10011";


bitset<n> b(s, pos);
b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval5, 3 );
则"b0" 为 "0000011010";

bitset<n> b(s, pos, num);
b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0;
string bitval ("11110011011");
bitset<6> b0 ( bitval5, 3, 6 );
则"b0" 为 "100110";

os << b
把b中的位集输出到os流
os >>b
输入到b中,如"cin>>b",如果输入的不是0或1的字符,只取该字符前面的二进制位.

bool any( )
是否存在置为1的二进制位?和none()相反

bool none( )
是否不存在置为1的二进制位,即全部为0?和any()相反.

size_t count( )
二进制位为1的个数.

size_t size( )
二进制位的个数

flip()
把所有二进制位逐位取反

flip(size_t pos)
把在pos处的二进制位取反

bool operator[]( size_type _Pos )
获取在pos处的二进制位

set()
把所有二进制位都置为1

set(pos)
把在pos处的二进制位置为1

reset()
把所有二进制位都置为0

reset(pos)
把在pos处的二进制位置为0

test(size_t pos)
在pos处的二进制位是否为1?

unsigned long to_ulong( )
用同样的二进制位返回一个unsigned long值

string to_string ()
返回对应的字符串.
luciferisnotsatan 2011-04-27
  • 打赏
  • 举报
回复
位运算原理
不就是 与,或,异或等那几个么。
赵4老师 2011-04-27
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧