打印长的二进制64位表示形式

时间:2018-10-16 22:55:27

标签: c bit-manipulation

我正在尝试打印long的二进制表示形式,以便练习位操作并为正在处理的项目在long中设置各种位。我可以成功打印int上的位,但是每当我尝试打印64位长的输出时,输出都是错误的。 这是我的代码:

#include <stdio.h> 

void printbits(unsigned long n){
    unsigned long i; 
    i = 1<<(sizeof(n)*4-1);
    while(i>0){
         if(n&1)
              printf("1"); 
         else 
              printf("0"); 
         i >>= 1; 
}

int main(){
    unsigned long n=10; 
    printbits(n); 
    printf("\n"); 
}

我的输出是0000000000000000000000000000111111111111111111111111111111111111110。 感谢帮助!

3 个答案:

答案 0 :(得分:4)

  • 4个字节的位数不正确
  • 即使您将其分配给class MatchPresenterTest { @Mock private lateinit var view:MatchContract @Mock private lateinit var apiService: MatchService @Mock private lateinit var appSchedulerProvider: AppSchedulerProvider private lateinit var presenter : MatchPresenter @Before fun setup(){ MockitoAnnotations.initMocks(this) RxAndroidPlugins.getInstance().registerSchedulersHook(object : RxAndroidSchedulersHook() { override fun getMainThreadScheduler(): Scheduler { return Schedulers.immediate() // or .test() } }) presenter = MatchPresenter(view,apiService,appSchedulerProvider) } @Test fun getLastMatch_shoul_callSucces(){ val event: MutableList<EventModel> = mutableListOf() val response = MatchModel(event) RxJavaHooks.setOnIOScheduler { scheduler1 -> Schedulers.immediate() } Mockito.`when`(apiService.getLastMatches() ).thenReturn(Observable.just(response)) presenter.getLastMatch() verify(view).onSuccess(response) verify(view).onFailed("failed") } unsigned long也是1 << …,所以您需要int
  • 1UL应该是n&1
  • 缺少右括号

仅修复:

n&i

如果您要专门打印64位数字,我将对64进行硬编码并使用#include <limits.h> #include <stdio.h> void printbits(unsigned long n){ unsigned long i; i = 1UL<<(sizeof(n)*CHAR_BIT-1); while(i>0){ if(n&i) printf("1"); else printf("0"); i >>= 1; } } int main(){ unsigned long n=10; printbits(n); printf("\n"); }

答案 1 :(得分:2)

问题是uint_least64_t出于多种原因不正确。

  1. i = 1<<(sizeof(n)*4-1)是32,而不是64。您可能想要sizeof(n)*4
  2. sizeof(n)*8可能会给您带来溢出,因为默认情况下1可能是32位。您应该使用1<<63
  3. 1ULL<<(sizeof(n)*8-1)不一定是64位。您应该使用unsigned long

如果要更全面,请使用unsigned long long(在sizeof(n) * CHAR_BIT中定义)。

通常,应尽可能使用<limits.h>定义(例如stdint)。

答案 2 :(得分:0)

以下应做您想做的事:

#include <stdio.h>

void printbits(unsigned long number, unsigned int num_bits_to_print)
{
    if (number || num_bits_to_print > 0) {
        printbits(number >> 1, num_bits_to_print - 1);
        printf("%d", number & 1);
    }
}

我们一直递归地调用该函数,直到我们打印了足够的位,或者打印了整数(以占用更多位为准)为止。

直接将其包装在另一个函数中,可以完全满足您的要求:

void printbits64(unsigned long number) {
    printbits(number, 64);
}